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 但没有可用的,则会导致错误 EAGAIN
或 EWOULDBLOCK
。您没有遇到这些情况。
在用于套接字通信的 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 但没有可用的,则会导致错误 EAGAIN
或 EWOULDBLOCK
。您没有遇到这些情况。