用select判断tcp连接是否断开
此代码只是截取的一部分,主要是为了说明select在正常连接且没有数据到来时,返回的是0,在有数据到来或者与远程的客户端或服务端断开的时候返回的是1,当select返回为1时我们开始读取数据,正常连接状态下读取的字节长度时大于0的,当远程连接断开时,读取的数据小于等于0,则说明远程连接已经断开
fd_set ReadSet;
struct timeval tv;
FD_ZERO(&ReadSet);
FD_SET(m_sockClient, &ReadSet);
tv.tv_sec = 0;
tv.tv_usec = 10000;
retval = select(m_sockClient + 1, &ReadSet, NULL, NULL, &tv);
if((retval>0)&&FD_ISSET(m_sockClient, &ReadSet))
{
//m_sockClient socket句柄,在连接时建立
int rLen= sock_read_n_bytes_tout(m_sockClient, readBuf, 1024, 3);
if(rLen<=0) //远程连接断开
{
sock_close(m_sockClient); //释放socket句柄
m_sockClient=-1;
}
}
参考链接
inux C语言 socket如何判断socket_fd对应的socket是否断开?(是否连通、是否正常连接)recv()、tcp_info TCP_ESTABLISHED、keepalive