Функция send () WinSock всегда возвращает 0 отправленных байтов - PullRequest
0 голосов
/ 19 января 2012

У меня проблема с функцией send () Winsock2. Независимо от того, какие данные я предоставляю, функция send () всегда возвращает 0; например, 0 байтов отправлено, и ошибок нет. Я уже некоторое время искал в Google, но пока не нашел решения. Я проверил, что отправляемые данные правильно отформатированы, и я передаю ему правильный сокет.

Вот фрагмент кода, в котором находится ошибка (я думаю, по крайней мере):

    //Send HTTP header to server
#define MAX_HEADER_LEN 512

#ifdef UNICODE

    char* cpHost = (char*)malloc(sizeof(char) * (_tcslen(cpServer)+1));
    wcstombs(cpHost, cpServer, _tcslen(cpServer));
    cpHost[_tcslen(cpServer)] = '\0';

#else
    char* cpHost = cpServer;
#endif

    char cpHeader[MAX_HEADER_LEN];
    sprintf(cpHeader, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", "/", cpHost);

#ifdef UNICODE
    free(cpHost);
#endif

    //Send the HTTP request to the sever
    int iSent;
    if(iSent = send(servSocket, cpHeader, strlen(cpHeader), 0) == SOCKET_ERROR)
    {
        _tprintf(TEXT("Error sending header to server: %d\n"), WSAGetLastError());
        WSACleanup();
        return 2;
    }

    _tprintf(TEXT("Sent '%d' bytes\n"), iSent);

    return 0;

Есть идеи, что вызывает такое поведение?

Вот полный источник файла (извините за все плохие привычки кодирования): http://pastebin.com/URsaFz0Q

Спасибо за вашу помощь, --Dylan

1 Ответ

4 голосов
/ 19 января 2012

Ваш код устанавливает iSent в ноль при успехе. В случае успеха send не возвращает SOCKET_ERROR, поэтому send(...)==SOCKET_ERROR имеет значение false. Ложь - ноль в С.

Изменение:

int iSent;
if(iSent = send(servSocket, cpHeader, strlen(cpHeader), 0) == SOCKET_ERROR)

Кому:

int iSent = send(servSocket, cpHeader, strlen(cpHeader), 0);
if(iSent == SOCKET_ERROR)

Или:

int iSent;
if( (iSent = send(servSocket, cpHeader, strlen(cpHeader), 0)) == SOCKET_ERROR)
...