send()发送空数据,recv能接收到吗?
发现一个问题,阻塞模式下,read与recv,没有读取到数据时,返回值仍然为0,无法判断服务端是否挂了,
bzero(buffer, sizeof(buffer)); //设置为0
// int valread = read(sock, buffer, BUFFER_SIZE);
ssize_t valread = recv(sock, buffer, BUFFER_SIZE, 0);
if(valread == 0){
//阻塞模式下,服务端send发送空数据,read与recv返回值为0,服务端挂了,read与recv返回仍然值为0
//非阻塞模式下,服务端send发送空数据,read与recv返回值为-1,服务端挂了,read与recv返回才值为0
//服务端发送空数据不会有任何解析数据,所以如果接收到数据长度为0时,判断为服务端终止
std::cerr << "Server disconnected." << std::endl;
break;
}
通以灵码给的回答:
在使用 send
函数发送空数据(即发送长度为0的数据)时,recv
函数在客户端可能不会明确地接收到任何数据。这是因为发送空数据通常不会产生实际的数据包,也不会触发网络层的传输。
发送空数据的行为
当你使用 send
函数发送长度为0的数据时,其行为取决于底层的实现和协议。通常情况下,发送空数据不会向网络发送任何实际的数据包,而是可能被视为一种控制消息。
send
函数的行为
当使用 send
函数发送空数据时,其行为如下:
- 返回值:
send
函数会返回0,表示成功发送了0个字节。 - 网络层:通常不会发送任何数据包到网络上。
- 接收方:
recv
函数在接收方可能不会接收到任何数据。
我自己测试了一下,客户端一直开着,期间打开服务端,然后终止服务端,得出两个结论:
客户端绑定的server socket阻塞模式下,服务端send发送空数据,read与recv返回值为0,服务端挂了,read与recv返回仍然值为0。
客户端绑定的server socket非阻塞模式下,服务端send发送空数据,read与recv返回值为-1,服务端挂了,read与recv返回才值为0。