2012-03-22 45 views
0

我有一段代碼將一個實現ping命令的代碼作爲更大代碼的一部分。一小時後PING超時

下面是這種情況:

  1. 潤平用 「-c」 或 「-t」 選項。
  2. 隨後通過Ctrl + C終止
  3. 大約一個小時後,我發現ping失敗。

這裏是 「插座」 呼叫: 襪子=插座(IP_AF_INET,IP_SOCK_RAW,IP_IPPROTO_ICMP);

在調用recvfrom之前,套接字被設置爲1秒的超時值。 當ping失敗時,我觀察到errno被設置爲EAGAIN。

我嘗試了一些測試,我相信它是由一個按Ctrl + C時沒有被關閉的套接字造成的。

我的問題是:如果我沒有像上面提到的場景那樣關閉套接字,我可以面對什麼問題?

+0

管理運行一些更多的測試,似乎在一個小時後ping失敗的初始診斷是不正確的。如果我打開了10個ICMP套接字,現在可以ping通了。當我有10個ICMP套接字打開時,同時ping errno EAGAIN失敗。 現在:是否有限制沒有。可以同時打開的ICMP套接字? 另外:有什麼辦法可以回收他們? – Zshn 2012-03-23 03:40:25

回答

0

單獨的Ctrl-C不會關閉任何東西 - 如果您的進程因此而終止,那麼套接字將以與您明確關閉它的方式相同的方式關閉。

ICMP套接字有些特別,因爲你可以讓它們中的任何一個監聽相同的數據包,所以即使你沒有關閉它們,這也不會影響其他ICMP套接字。

搞我的水晶球,我會說你打開大量的套接字,不關閉它們,一小時後,用完文件描述符。只需重新使用已擁有的那個,並在不再需要ping任何人時關閉它。

+0

正在使用的ping命令被實現爲較大系統的一部分。因此,Ctrl + C只是關閉那個進程(執行命令ping的那個進程)。在這種情況下,你是否仍然認爲SD應該關閉?我使用命令netstat檢查並發現sd仍然打開。但是,當整個系統重新啓動時,sd將按預期收回。 – Zshn 2012-03-23 03:34:45

+0

如果fd仍然打開,那麼該過程仍然存在 - 所以要麼你自己處理SIGINT,要麼由於某種原因信號沒有傳遞給你的過程(與會話分離,...) – 2012-03-23 08:00:45