怎么判断 TCP链接 是否断开了呢

今天用select IO复用时,发现  没有数据交互的情况下,select也返回(还未超时)。 查书得知,当fd在失去链接时select总是返回。并且read结果为空。

那么怎么判断tcp链接是否断开呢。查质料如下:

 * Seems like the most portable way of detecting connect()
* failure is to call getpeername(). If socket is connected,
* getpeername() will return 0. If the socket is not connected,
* it will return ENOTCONN, and read(fd, &ch, 1) will produce
* the right errno through error slippage. This is a combination
* of suggestions from Douglas C. Schmidt and Ken Keys.
*/
{
   struct sockaddr_in addr;
   int addrlen = sizeof(addr);


   status = pj_sock_getpeername(h->fd, (struct sockaddr*)&addr,
        &addrlen);
}


用getpeername 来判断是否断开链接:

当getpeername返回 0 是证明是链接状态

当返回值是ENOTCONN时没有链接。




 当用select 时,如果链接断开时,一直会返回可读,这样有select 有可能进入死循环。所以在select中一定要判断链接是否断开。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值