首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:如何在不适当关闭套接字的情况下突然断开连接

Python:如何在不适当关闭套接字的情况下突然断开连接
EN

Stack Overflow用户
提问于 2012-11-20 00:37:49
回答 2查看 2.3K关注 0票数 16

我有一个Python测试程序,用于测试另一个软件组件的特性,让我们将后者称为被测组件(COT)。Python测试程序通过持久的TCP连接连接到COT。Python程序使用Python套接字API来实现这一点。现在,为了模拟物理链路的故障,我想让Python程序关闭套接字,但不适当地断开连接。也就是说,我不想再在TCP通道上发送任何内容,包括任何TCP SYN/ACK/FIN.。我只想让套接字静默。它不能再对远程数据包作出响应。

这并不像看起来那么简单,因为在套接字上调用close会将TCP FIN数据包发送到远程终端。(优雅的断开)。那么,如何在不发送任何数据包的情况下终止套接字呢?

我不能关闭Python程序本身,因为它需要维护到其他组件的其他连接。为了获取信息,套接字在单独的线程中运行。所以我突然想到了杀掉线程,但这也不是那么容易。(Is there any way to kill a Thread in Python?)

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-20 00:56:46

你不能在一个userland进程中做到这一点,因为内核中的网络堆栈仍然保存着与给定TCP连接相关的资源和状态。事件,如果你杀死了你的整个进程,内核将会向另一端发送一个FIN,因为它知道你的进程有什么文件描述符,并且会尝试正确地清理它们。

解决这个问题的一种方法是使用防火墙软件(在本地或中间机器上)。调用一个脚本,该脚本告诉防火墙丢弃来自/去往给定IP和端口的所有数据包(当然,这需要适当的管理权限)。

票数 13
EN

Stack Overflow用户

发布于 2012-11-20 06:07:34

与Nikolai的回答相反,确实有一种方法可以从用户端重置连接,以便发送RST并丢弃挂起的数据,而不是在所有挂起的数据之后使用FIN。然而,由于它被滥用的比使用的更多,我不会在这里发布它。我不知道Python能否做到这一点。设置三种可能的SO_LINGER配置之一并关闭即可完成此操作。我不会说更多,我会说,这种技术应该只用于问题中概述的目的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13458206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档