WinSock的send()总是返回0字节发送

时间:2012-01-19 04:17:09

标签: c winapi network-programming winsock winsock2

我遇到了Winsock2函数send()的问题。无论我提供什么数据,send()函数总是返回0;例如发送0个字节,没有错误。我现在谷歌搜索了一段时间,但尚未找到解决方案。我已检查发送的数据是否格式正确,我正在传递一个有效的套接字。

以下是错误所在代码的片段(我至少会想到):

    //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 个答案:

答案 0 :(得分:4)

您的代码在成功时将iSent设置为零。成功时,send不会返回SOCKET_ERROR,因此send(...)==SOCKET_ERROR为false。 C中的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)