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

来源:互联网 发布:跑步软件排行 编辑:程序博客网 时间:2024/04/28 17:16

今天用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中一定要判断链接是否断开。

原创粉丝点击