recv() 不等待数据

recv() not waiting for data

在用于套接字通信的 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() 应该等到数据被发送,并且服务器正在发送 none。

来自我的 Linux 系统的手册页,

When a stream socket peer has performed an orderly shutdown, the return value will be 0 (the traditional "end-of-file" return).

Datagram sockets in various domains (e.g., the UNIX and Internet domains) permit zero-length datagrams. When such a datagram is received, the return value is 0.

The value 0 may also be returned if the requested number of bytes to receive from a stream socket was 0.

所以要么连接已关闭,要么您收到了一个 0 字节的数据报。无休止的重复表明是前者。反复尝试从关闭的连接中读取不会神奇地重新打开它。

这不是错误。

These calls return the number of bytes received, or -1 if an error occurred. In the event of an error, errno is set to indicate the error.

信号中断导致错误EINTR。如果创建了套接字 non-blocking 但没有可用的,则会导致错误 EAGAINEWOULDBLOCK。您没有遇到这些情况。