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