3

我正在本地运行一个长时间运行的套接字连接。当我杀死服务器应用程序时,它会干净地关闭。我现在想看看客户端在关闭不干净时的行为。如果他们在不同的服务器上,我可以拔出网线。当连接是本地的时,我没有什么可拉的。[在这里插入粗鲁的笑话。]

我可以netstat -an |grep tcp | grep :80看到连接,它看起来像这样:

tcp        0      0 10.1.2.3:80          10.1.2.3:40494       ESTABLISHED

我可以使用那个 40494 端口号来杀死或挂起套接字,就像我可以使用程序的 PID 来杀死它一样吗?

非常相似的问题:如何模拟“插入的网络电缆”(TCP/IP)? (这个问题是关于 Windows 的,我在 Linux 上)

4

2 回答 2

0

卸载网络驱动程序的内核模块可能会以您想要的方式杀死它。

从活动列表中选择您的网络接口(eth0、eth1 等...)

ifconfig -a
eth0      Link encap:Ethernet  HWaddr 18:A9:05:68:6F:B0  
          inet6 addr: fe80::1aa9:5ff:fe68:6fb0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9000  Metric:1

找到eth0接口的驱动模块

ls -l /sys/class/net/eth0/device/driver/module
lrwxrwxrwx  1 root root    0 Aug 15 18:39 module -> ../../../../module/bnx2

列出系统运行的内核模块

lsmod | grep bnx
bnx2i                  48158  0 
cnic                   55511  1 bnx2i
bnx2                   81890  0 

要从内存中删除模块将需要 root 或 sudo 访问权限

rmmod -f -w bnx2

这不是一个安全的操作,你以不安全的方式弄乱操作系统。当你这样做时,预计会发生坏事(tm)。不要在生产环境中这样做。此外,这可能无法正常工作,具体取决于驱动程序行为本身。

也就是说,这是一个有趣的问题,我很想知道结果如何。

于 2013-08-10T02:39:23.850 回答
0

看来答案是“不”,没有办法杀死特定的连接。

我最终做的是sudo ifdown eth0(然后sudo ifup eth0是恢复网络)。显然,这是一种大锤方法,因为它会断开所有连接。

为了完整起见,另一种方法是猜测哪个 Apache 进程正在运行套接字连接,然后只杀死那个进程。但除了涉及猜测之外,这也比我问的问题更具体。

于 2014-01-09T23:58:34.140 回答