关闭所有接口下的TCP套接字

4
我需要在以太网接口断开连接(例如电缆断开,接口关闭等)时立即关闭所有正在进行的Linux TCP套接字。

似乎无法通过hack /proc来解决。 没有找到任何有价值的ioctl。

手动在应用程序级别上完成并不是我想要的,我真的正在寻找一种残酷且全局的方法。

有人之前遇到过这种情况并愿意分享他的发现吗?


3
SCO?对于 Linux 领域而言,这是一个非常不幸的首字母缩写或用户名选择。 :) - Duck
2个回答

0

避免应用级编程的残酷方式是通过黑客手段修改内核,在所有连接中启用低超时时间的TCP keepalive。


感谢您的建议。我尝试了以下命令:sysctl -w
net.ipv4.tcp_keepalive_time=15
net.ipv4.tcp_keepalive_intvl=5
net.ipv4.tcp_keepalive_probes=2然而,我猜测我做错了什么,因为在15+2*15秒后,TCP套接字并没有关闭:之前:tcp 0 0 192.168.10.103:52635 ext.domain.net:1234 ESTABLISHED两分钟后:tcp 0 0 192.168.10.103:52635 192.168.0.12:1234 ESTABLISHED您是指源代码修改吗?在修改代码之前,我想确保我对keepalive的理解是正确的。
- SCO
不通过黑客手段修改内核,应用程序仍需为每个套接字激活keepalive。 - Peter G.
谢谢Pete。 我已添加以下内容,但这并未改变结果: if ((sock=socket(PF_INET,SOCK_STREAM,0))==-1) return -1; if (setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE, (char*)&option,sizeof (option))==-1) { close(sock) ; return -1; } - SCO
嗯,我本以为这会起作用。变量选项是int类型,并且值为1?请参见http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/。 - Peter G.
1
使用netstat -o选项查看超时状态。我使用netstat -tanop来查看TCP套接字。 - ninjalj
谢谢Peter。已经解决了,选项值是整型,但根本没有设置:(我想现在我可以进行内核编程了!Ninjal,netstat -tanop输出令人印象深刻!感谢你的提示;)! - SCO

0

这很少需要,而且通常不会起作用。TCP是一种数据传输协议,除非有数据丢失,否则不应该做任何操作。三思而后行,想想为什么你需要这样做。

否则,您可以尝试定期轮询接口并检查UP标志。如果接口失去了UP标志,那么操作系统已经针对电缆被拔出并关闭了接口。man 7 netdevice,详见SIOCGIFFLAGS。

网络驱动程序也会在插入电缆时生成事件,但我不确定用户是否可以访问该事件。您可能想要检查udev,因为其文档明确提到了网络接口


网络信息和事件通常可以在 netlink 套接字上获得。 - ninjalj
@ninjalj:你是指http://linux.die.net/man/7/rtnetlink RTM_GETLINK吗?你有示例代码或类似的指针吗? - Dummy00001
1
Dummy,Ninjal,感谢您的建议。不过我想我会采用“保持连接”解决方案:关闭接口并不会关闭正在进行的TCP套接字。 - SCO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接