有没有办法在Linux上以C/C++编程的方式不正常地关闭TCP连接?
为了进行测试,我想模拟这样一种情况:一个端点突然断电,而没有传输任何FIN和/或RST,也没有刷新任何缓冲区。
有没有办法在Linux上以C/C++编程的方式不正常地关闭TCP连接?
为了进行测试,我想模拟这样一种情况:一个端点突然断电,而没有传输任何FIN和/或RST,也没有刷新任何缓冲区。
socket(AF_INET, SOCK_STREAM, 0);
打开套接字,则无法预测地实现不优雅的关闭,即使杀死进程仍会让内核域控制关闭套接字。ifdown
, iptables
),并从程序中调用它来解决这个问题。或者,您将不得不使用 socket(AF_INET, SOCK_RAW, 0);
实现自定义 TCP 代码,以便内核不会尝试优雅地关闭它(因为它甚至不知道它是一个 TCP 套接字)。最简单的模拟连接“突然中断”的方法可能是阻止(丢弃)连接上的传入数据包。一个类似于netfilter的命令:
iptables -A INPUT -p tcp --dport $PORT -j DROP
将会执行此操作--使用连接的本地端口号替换$PORT
。这不会阻塞出站数据包(如果您有保持活动或定期发送数据的需求,则可能会出现问题)。您可以使用以下方法完成此操作:
iptables -A OUTPUT -p tcp --sport $PORT -j DROP
在完成后,请务必删除这些过滤规则,否则它们会留下并引起问题。
我更喜欢对网络驱动程序中断处理进行操作。
Linux内核提供了一种将IRQ亲和性设置为特定CPU的方法,以便IRQ只能由这些CPU处理。通过将IRQ亲和性设置为空CPU集,您可以有效地禁用IRQ。
禁用irqbalance守护程序。然后检查您的NIC驱动程序使用哪些中断。
cat /proc/interrupts
然后禁止任何CPU处理nic中断:
echo 0 > /proc/irq/N/smp_affinity
你可以使用 unistd.h
库中的 close
函数来关闭与套接字相关联的文件描述符。然而,值得注意的是,该方法可能不会立即终止连接,因为底层 TCP 协议有其自己的机制来关闭连接,并且这些机制可能需要一些时间才能完成。