项目上遇到一个问题:
如何在不read socket的情况下判断 该socket是否已经closed ?(注意是tcp state closed 不是 conn disconnected)
1 通过getsockopt 判断socket状态
struct tcp_info info;
int len=sizeof(info);
getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
if((info.tcpi_state==TCP_CLOSE)) // 则断开
UNP 上面对
getsockopt
的介绍中没有TCP_INFO这个选项,在网上查资料的时候,发现这方面资料很少,并且提示这个选项是linux 2.6才有的。本来想查到具体的小版本(2.6.X),以确定生产环境是否高于这个版本,结果manual了一下
man 7 tcp:
TCP_INFO (since Linux 2.4)
Used to collect information about this socket. The kernel returns a struct tcp_info as defined in the file
/usr/include/linux/tcp.h. This option should not be used in code intended to be portable.
发现自linux 2.4就支持这个选项了,看来多虑了。
2 通过getpeername 函数出错来确认socket closed
#include <sys/socket.h>
int ret = getpeername(sockfd, addr, addrlen);
if(ret = -1 && error == ENOTCONN)//说明连接已经关闭
后记:
client 端 close(socket)返回成功,不代表server已经收到所有数据,更不代表 已经server端已经关闭句柄。