c ++ winsock recv在接收0数据时终止线程而不是返回错误代码

时间:2012-10-10 23:48:53

标签: c++ winsock recv

已经为服务器建立了有效的套接字连接。有一个简单的循环,用于继续接收数据,直到服务器停止发送为止。所有文档都表明,尝试recv()太多次只会导致它返回0或-1(取决于具体情况)。相反,它使用某种IOError(在recv调用的行)杀死线程。我错过了什么?

编辑:sad只是一些字符串流。我保证这与问题无关:D

另一个编辑:包含errno.h并检查错误代码,但无济于事。

do {            
    memset(buffer,0,sizeof(buffer));
    bytes = recv(s,buffer,sizeof(buffer)-40,0);
    sad << buffer;
    Sleep(1);
} while (bytes>0);

1 个答案:

答案 0 :(得分:1)

也许您还应该检查errno,因为通信渠道可能会过早结束。

#include <errno.h>
#include <string.h>

do {            
    memset(buffer,0,sizeof(buffer));
    bytes = recv(s,buffer,sizeof(buffer)-40,0);
    if (errno)
       break;
    sad << buffer;
    Sleep(1);
} while (bytes>0);

if (errno)
   std::cerr << "Premature end of connection: " << strerror(errno) << '\n';