linux tcp服务端检测链路断开,tcp 服务端如何判断客户端断开连接

本文探讨了Linux TCP服务端如何在客户端断开连接后检测到这一情况,包括通过select()和recv()函数的返回值判断、getsockopt()方法,以及TCP的保活定时器、SO_KEEPALIVE、SIO_KEEPALIVE_VALS和Heart-Beat线程等策略。总结了keepalive和heart-beat的区别,并提供了相关示例链接。

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

1.C/S结构。功能方面比较简单就是client端与server端建立连接,然后发送消息给server,如果socket连接断开(异常,正常)后,我如何才能感知到?

要求:server端这边是绝对被动的,sever端不能主动断开连接。也没有连接链路维持包之类的。client端发送数据的时间也是不定的。在socket连接断开后, server要能够感知到并释放资源。

方案1:当使用 select()函数测试一个socket是否可读时,如果select()函数返回值为1,且使用recv()函数读取的数据长度为0 时,就说明该socket已经断开。

为了更好的判定socket是否断开,我判断当recv()返回值小于等于0时,socket连接断开。但是还需要判断 errno是否等于 EINTR 。如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的,socket连接还是正常的,不应close掉socket连接。

方案2:

我的方法不一样,我用getsockopt来判断,还是蛮准确的

int SocketConnected(int sock)

{

if(sock<=0)

return 0;

struct tcp_info info;

int len=sizeof(info);

getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);

if((info.tcpi_state==TCP_ESTABLISHED))

{

//myprintf("socket connected\n");

return 1;

}

else

{

//myprintf("socket disconnected\n");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值