16

我有一个 Python 测试程序,用于测试另一个软件组件的功能,我们将后者称为被测组件 (COT)。Python 测试程序通过持久的 TCP 连接连接到 COT。Python 程序为此使用 Python 套接字 API。现在为了模拟物理链接的故障,我想让 Python 程序关闭套接字,但没有适当地断开连接。即我不想再在 TCP 通道上发送任何东西,包括任何 TCP SYN/ ACK/ FIN。我只是想让插座安静下来。它必须不再响应远程数据包。

这并不像看起来那么容易,因为调用close套接字会将 TCPFIN数据包发送到远程端。(优雅断开连接)。那么我怎样才能在不发送任何数据包的情况下杀死套接字呢?

我无法关闭 Python 程序本身,因为它需要维护与其他组件的其他连接。有关信息,套接字在单独的线程中运行。所以我想到了突然杀死线程,但这也不是那么容易。(有什么方法可以杀死 Python 中的线程吗?

有任何想法吗?

4

2 回答 2

13

您不能从用户态进程执行此操作,因为内核网络堆栈仍然保存与给定 TCP 连接相关的资源和状态。如果您杀死整个进程,内核将向FIN另一端发送一个事件,因为它知道您的进程具有哪些文件描述符,并会尝试正确清理它们。

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

于 2012-11-19T16:56:46.213 回答
-1

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

于 2012-11-19T22:07:34.257 回答