python如何判断tcp异常断开_tcp 服务端如何判断客户端断开连接

一篇文章:

最近在做一个服务器端程序,C/S结构。功能方面比较简单就是client端与server端建立连接,然后发送消息给server。我在server端会使用专门的线程处理一条socket连接。这就涉及到一个问题,如果socket连接断开(异常,正常)后,我如何才能感知到?server端这边是绝对被动的,sever端不能主动断开连接。也没有连接链路维持包之类的。client端发送数据的时间也是不定的。在socket连接断开后, server要能够感知到并释放资源。

这个问题在思考测试,询问同事之后,找到了一个方法,可以做到这一点。

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

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

PS:对于堵塞socket的recv函数会在以下三种情况下返回:

(1)recv到数据时,会返回。

(2)在整个程序接收到信号时,返回-1。errno = EINTR。//在程序的起始阶段,屏蔽掉信号的除外。部分信号还是屏蔽不掉的。

(3)socket出现问题时,返回-1.具体错误码看 man recv()

(4)一定要看 man 说明,很详细,很有帮助。

这种方法经过长时间测试后,是有效的。所以写出来让大家参考一下,请大家发表意见。

tcp会自动断开连接吗?

已经建立了TCP连接,并可能互通信息。但是如果长时间不进行信息的传递。这个TCP连接会自动断开吗?

如果能自动断开的话,这个时间大约是多少呢?

回答:TCP的保活定时器能够保证TCP连接一直保持,但是TCP的保活定时器不是每个TCP/IP协议栈就实现了,因为RFC并不要求TCP保活定时器一定要实现。

摘自《TCP/IP详解》卷1第23章:保活并不是T C P规范中的一部分。Host Requirements RFC提供了3个不使用保活定

时器的理由: (1) 在出现短暂差错的情况下,这可能会使一个非常好的连接释放掉;

(2)它们耗费不必要的带宽;(3)在按分组计费的情况下会在互联网上花掉更多的钱。

然而,许多实现提供了保活定时器。

更具体的资料,请参阅RFC。

tcp/ip详解更全面的描述:

23.1介绍

在一个空闲的(idle)TCP连接上,没有任何的数据流,许多TCP/IP的初学者都对此感到惊奇。也就是说,如果TCP连接两端没有任何一个进程在向对方发送数据,那么在这两个TCP模块之间没有任何的数据交换。你可能在其它的网络协议中发现有轮询(polling),但在TCP中它不存在。言外之意就是我们只要启动一个客户端进程,同服务器建立了TCP连接,不管你离开几小时,几天,几星期或是几个月,连接依旧存在。中间的路由器可能崩溃或者重启,电话线可能go down或者back up,只要连接两端的主机没有重启,连接依旧保持建立。

这就可以认为不管是客户端的还是服务器端的应用程序都没有应用

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值