2010-07-19 78 views
4

一旦以太網接口斷開(即電纜斷開連接,接口關閉等),我需要關閉所有正在進行的Linux TCP套接字。關閉接口Down上的所有TCP套接字

攻入/ proc似乎沒有辦法。沒有發現任何有價值的ioctl's。 在應用程序級別手動執行它並不是我想要的,我真的正在尋找一種殘酷的全局方式。

以前是否曾經遇到過這種情況,願意分享他的基礎?

+3

SCO?一個相當不幸的一組縮寫或選擇用戶名的Linux部分。 :) – Duck 2010-07-19 13:50:33

回答

0

避免應用程序級編碼的殘酷方式是黑客攻擊您的內核,以便爲您的所有連接啓用TCP keepalive,並且延遲時間很短。

+0

感謝您的建議。我試過如下: 的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 2分鐘後: TCP 0 0 192.168.10.103:52635 192.168.0.12:1234已建立 你的意思是源黑客?在入侵代碼之前,我想確保我對keepalive的理解是正確的。 – SCO 2010-07-19 13:46:41

+0

在不破解內核的情況下,應用程序仍然必須爲每個套接字激活keepalive。 – 2010-07-19 13:49:42

+0

謝謝皮特。 我添加了以下內容,但是這並沒有改變結果: if((sock = socket(PF_INET,SOCK_STREAM,0))== - 1)return -1;如果(setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,(char *)&option,sizeof(option))== - 1){close(sock);返回-1; } – SCO 2010-07-19 14:29:37

0

這是很少需要的,往往是行不通的。 TCP是一種數據傳輸協議,除非有數據丟失,不應該做任何事情。想想你爲什麼會需要這個。

否則,您可以嘗試定期輪詢接口並檢查UP標誌。如果接口失去UP標誌,則操作系統已經在電纜被拔出並向下接口時作出反應。 man 7 netdevice,詳情請參閱SIOCGIFFLAGS。

網絡驅動程序即使在連接電纜時也會生成事件,但我不確定您是否可以從用戶訪問該事件。您可能需要檢查udev,因爲其documentation明確提及​​。

+0

網絡信息和事件通常在netlink套接字上可用。 – ninjalj 2010-07-19 20:31:01

+0

@ninjalj:你的意思是http://linux.die.net/man/7/rtnetlink RTM_GETLINK?你有指向示例代碼或類似的指針嗎? – Dummy00001 2010-07-19 20:54:16

+0

Dummy,Ninjal,感謝您的建議。 但是我想我會選擇'Keepalive'解決方案:DOWN'ing界面不會關閉正在進行的TCP套接字。 – SCO 2010-07-22 07:13:24