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

Scr*_*tch 14 python sockets

我有一个Python测试程序用于测试另一个软件组件的功能,让我们称之为被测组件(COT).Python测试程序通过持久TCP连接连接到COT.Python程序正在使用Python套接字API.现在为了模拟物理链路的故障,我想让Python程序关闭套接字,但不要正确断开连接.即我不想再在TCP通道上发送任何东西,包括任何TCP SYN/ ACK/ FIN.我只想让套接字保持沉默.它不能再响应远程数据包了.

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

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

有任何想法吗?

Nik*_*sov 11

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

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