在用于套接字通信的while(1)循环的第一次迭代中,一切正常--在第二次迭代中,即使连接仍然处于打开状态并正在进行(服务器的send()等待用户在这个套接字上插入数据),来自客户端的recv()无法等待数据。
while(1)
memset(buffer, 0, 300);
int nRet = recv(sock, buffer, 299, 0);
printf("Recv: %d\n", nRet);
if(nRet < 0)
fprintf(stderr, "recv() failed.");
else if(nRet == 0)
continue;
else
fprintf(stdout, buffer);这是循环的开始,这是值得关注的。在第二次迭代中,输出是"Recv: 0“的无限打印。在我看来,这似乎是不合逻辑的-- recv()应该等到数据被发送,而服务器没有发送数据。
发布于 2022-02-10 23:45:56
在我的Linux系统的手册页上,
当流套接字对等端执行有序关闭时,返回值将为0(传统的“文件结束”返回)。
各种域(例如UNIX和Internet域)中的数据报套接字允许零长度的数据报.当收到这样的数据报时,返回值为0。
如果请求从流套接字接收的字节数为0,也可以返回值0。
所以要么连接关闭了,要么你收到了一个0字节的数据报.无止境的重复暗示着前者。反复尝试从关闭的连接读取不会神奇地重新打开它。
它不是一个错误。
这些调用返回接收到的字节数,如果发生错误则返回-1。如果发生错误,将errno设置为指示错误。
信号中断导致误差EINTR。如果套接字是非阻塞的,而没有可用的,则会导致错误EAGAIN或EWOULDBLOCK。你没有经历过这两件事。
https://stackoverflow.com/questions/71072727
复制相似问题