阻塞与非阻塞模式下,tcp客户端判断服务端是否终止

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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值