我有一个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?)
有什么想法吗?
答案 0 :(得分:11)
您无法通过用户空间进程执行此操作,因为内核网络堆栈仍保留与给定TCP连接相关的资源和状态。事件如果你终止整个进程,内核将向另一方发送FIN
,因为它知道你的进程有哪些文件描述符,并会尝试正确地清理它们。
解决此问题的一种方法是使用防火墙软件(在本地或中间机器上)。调用一个脚本,告诉防火墙从/向给定的IP和端口丢弃所有数据包(当然需要适当的管理权限)。
答案 1 :(得分:0)
与Nikolai的回答相反,确实有一种方法可以重置来自用户空间的连接,以便发送RST并丢弃待处理的数据,而不是在所有待处理数据之后的FIN。然而,因为它比使用更滥用,我不会在这里发布它。我不知道是否可以通过Python完成。设置三个可能的SO_LINGER配置之一并关闭将执行此操作。我不会说更多,我会说这种技术只能用于问题中概述的目的。