python中socket处于close_wait状态

当服务器关闭TCP连接并发送FIN信号时,客户端的socket进入close_wait状态。在这种状态下,应用层需调用close来发送FIN并最终关闭连接。Python中,如果socket在close_wait状态下尝试send,会先关闭socket再抛出异常。若数据量大,sendall在发送一半时连接被断开,socket将保持close_wait状态,不会尝试关闭。

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

python中使用socket进行编程时,发现client的tcp经常处于close_wait状态:linux中使用命令
# netstat -atpn


原因是server端关掉了tcp连接,给client发送FIN信号,client的tcp层回了ACK,然后它的socket状态就处于close_wait状态。

实验:

python中,socket在send之前处于close_wait状态,那么该send不会报错,并且执行完之后socket就closed了。再继续调用send就会报错。


推理:

说明python的socket.send在发送数据之前会检查socket的状态,如果处于close_wait,就执行close(socket)(应用层感觉不到哦),然后正常退出。所以再次send时,会抛出异常。


为什么会一直处close_wait状态?

    当socket处于close_wait时,必须由应用层调用close(socket),发送FIN给server端才能变为LAST_ACK,接收到server端回应的ACK后,才变为CLOSED。如果应用层不调用close(),那么socket会一直处于close_wait。[1]


如果我在python中不断循环去调用socket.sendall(),那么在socket变为close_wait后,通过socket.sendall()也会关闭socket,为什么它还是一直处在close_wait状态呢?

    原因在于当sendall(data)的data比较大,在data被发送一半时,连接被server端断掉了。那么sendall(data)会一直卡在那,也就不会执行到sendall的开始处,去判断socket状态,确定是否关闭socket了。

    简单而言,就是socket在变为close_wait之后,根本没有调用sendall()去关闭socket。



参考文献:

[1] Explaining Close_Wait - Jane Lewis's Weblog - Site Home - TechNet Blogs

[2] Linux socket通信出现CLOSE_WAIT状态的原因与解决方法-fly123456789-ChinaUnix博客

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值