2012-11-19 79 views
10

我有一个用于测试另一个软件组件的功能的Python测试程序,我们称后者为被测组件(COT)。 Python测试程序通过持久的TCP连接连接到COT。 Python程序正在为此使用Python套接字API。 现在为了模拟物理链接的故障,我希望Python程序关闭套接字,但不能正确断开连接。 也就是说我不想再在TCP通道上发送任何内容,包括任何TCP SYN/ACK/FIN。我只想让套接字静音。它不能再响应远程数据包。Python:如何突然断开套接字而没有正确关闭套接字

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

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

任何想法?

回答

7

由于在内核网络堆栈仍然保存与给定TCP连接相关的资源和状态,因此无法从用户态进程执行此操作。事件如果你杀了你的整个进程,内核将发送一个FIN到另一侧,因为它知道你的进程有什么文件描述符,并会尝试正确地清理它们。

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

+0

尼古拉,谢谢,这就是我怀疑的。顺便说一句,我的意思是FIN而不是RST。更正了这个问题。 – Scrontch

+0

@Scrontch这个答案不正确。 – EJP

0

与尼古拉的答案相反,确实有一种方法可以重置来自userland的连接,以便发送RST并挂起数据丢弃,而不是在所有未决数据之后发出FIN。然而,由于它比滥用更加滥用,我不会在这里发布它。我不知道它是否可以从Python完成。设置三种可能的SO_LINGER配置中的一种并关闭就可以了。我不会多说,我会说这种技术只能用于问题中概述的目的。

+0

那么,泄漏豆类,男人:)顺便说一句,据我所知,“我不想再发送任何东西在TCP通道上”也意味着没有'RST'。 –

+0

@NikolaiNFetissov同意。这个答案是作为对你的评论开始的,但最后它似乎更多地是一个答案。也许它不是。 – EJP