【问题标题】:WinSock's send() always returning 0 bytes sentWinSock 的 send() 总是返回 0 个字节发送
【发布时间】:2012-01-19 04:17:08
【问题描述】:

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

这是错误所在代码的 sn-p(至少我认为):

    //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

感谢您的帮助, --迪伦

【问题讨论】:

    标签: c winapi network-programming winsock winsock2


    【解决方案1】:

    您的代码在成功时将iSent 设置为零。成功时,send 不会返回 SOCKET_ERROR,因此send(...)==SOCKET_ERROR 为假。 False 在 C 中为零。

    变化:

    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)
    

    【讨论】:

    • 是的,就是这样。奇怪的是,我可以发誓我以前使用过这种技术并且没有问题。不管怎样,谢谢你的帮助!
    • 对不起;在接受之前必须等待 5 分钟,然后就被转移了。接受。
    猜你喜欢
    • 2017-02-13
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多