c++ winsock recv terminates thread instead of returning error code when receiving 0 data
已经与服务器建立了有效的套接字连接。有一个简单的循环设计为继续接收数据,直到服务器停止发送更多数据为止。所有文档都表明,尝试recv()太多次只会导致它返回0或-1(取决于情况)。相反,它使用某种IOError(在recv调用的行中)杀死线程。我想念什么?
编辑:sad只是一些字符串流。我保证与问题无关:D
另一个编辑:包括errno.h并检查了errno代码,但无济于事。
1 2 3 4 5 6
| do {
memset(buffer,0,sizeof(buffer));
bytes = recv(s,buffer,sizeof(buffer)-40,0);
sad << buffer;
Sleep(1);
} while (bytes>0); |
也许您还应该检查errno,因为通信通道的一端可能过早。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #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) << '\
'; |
- 尝试过它,但是线程只是在以bytes =开头的行运行时死掉。包括/检查errno并没有改变它,尽管这是一个很好的想法。
-
尝试处理SIGPIPE:stackoverflow.com/questions/108183/…(顺便说一下,信号通常也会打断睡眠)
-
我只是尝试了几种方法,但无法弄清楚如何强制对其进行处理。我正在Windows下编译,我确定这是通常的问题。看来我没有SO_NOSIGPIPE,也没有signal(SIGPIPE, SIG_IGN);为我做。试图查找一个与recv一起运行的标志以忽略它,但是文档并没有为它显示任何内容...编辑:还快速学习了这些信号的unix和Windows实现之间的区别
-
唔。确实有点毛。我认为您已经做了所有正确的事情。当您在IDE中运行此代码时,您能看到发生的任何"第一次机会异常"(或Visual Studio称其为什么)吗?您可以控制连接的另一端,以便检查它是否仍然有效吗?也许用netcat代替它进行测试?
-
嗯,打个好电话。我认为我对行为有一些误解。线程似乎只是暂停了(可能直到它实际接收到了什么?)。奇怪的是,它让父母同意了。 (至少我不需要处理任何喜欢抛出xD的窗口)
-
试图设置超时,希望能解决这个问题,但没有骰子:(
-
线程似乎只是暂停(可能直到它实际接收到什么东西为止?)-这是正常的行为。那就是阻塞套接字应该发生的事情。 recv()除非有任何事情发生,否则不会返回-数据接收,被对等方关闭的套接字,超时或错误。我不明白"这很奇怪,但父母同意了"-什么回避?我在那里看不到任何"父母"信号吗?同样,您不需要任何sleep()调用。