Python:如何在不正确关闭套接字的情况下突然断开套接字

时间:2012-11-19 16:37:49

标签: python sockets

我有一个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?

有什么想法吗?

2 个答案:

答案 0 :(得分:11)

您无法通过用户空间进程执行此操作,因为内核网络堆栈仍保留与给定TCP连接相关的资源和状态。事件如果你终止整个进程,内核将向另一方发送FIN,因为它知道你的进程有哪些文件描述符,并会尝试正确地清理它们。

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

答案 1 :(得分:0)

与Nikolai的回答相反,确实有一种方法可以重置来自用户空间的连接,以便发送RST并丢弃待处理的数据,而不是在所有待处理数据之后的FIN。然而,因为它比使用更滥用,我不会在这里发布它。我不知道是否可以通过Python完成。设置三个可能的SO_LINGER配置之一并关闭将执行此操作。我不会说更多,我会说这种技术只能用于问题中概述的目的。