如何判断一个SOCKET连接是否已经断开

本文介绍了两种判断UNIX/Linux环境下SOCKET连接状态的方法:一是利用recv函数结合MSG_PEEK标志进行实时检测;二是启用TCP_KEEPALIVE选项实现周期性检查。recv函数返回值及errno的不同组合可用于区分正常、被动关闭和主动关闭的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1. 根据ERRNO和recv结果进行判断

在UNIX/LINUX下,非阻塞模式SOCKET可以采用recv+MSG_PEEK的方式进行判断,其中MSG_PEEK保证了仅仅进行状态判断,而不影响数据接收

对于主动关闭的SOCKET, recv返回-1,而且errno被置为9(#define EBADF   9 /* Bad file number */)或104 (#define ECONNRESET 104 /* Connection reset by peer */)

对于被动关闭的SOCKET,recv返回0,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */)

 对正常的SOCKET, 如果有接收数据,则返回>0, 否则返回-1,而且errno被置为11(#define EWOULDBLOCK EAGAIN /* Operation would block */)

 

因此对于简单的状态判断(不过多考虑异常情况):

  •     recv返回>0,   正常
  •     返回-1,而且errno被置为11  正常
  •     其它情况    关闭

 

int np_socket_alive (int conn_fd) {
char buff[32];
int recv_buff = recv (conn_fd, buff, sizeof (buff), MSG_PEEK);
int sockErr = errno;

    if (recv_buff > 0)  // Get Data
        return 1;
    if ((recv_buff == -1) && (sockErr == EWOULDBLOCK))  // No Data recieved
        return 1;
    return -1;
}

 

2. 通过TCP_KEEPALIVE进行判断

 

参考子文献:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值