2014-02-19 48 views
0

像往常一樣,這些天我對我的網絡冒險有一個問題。TCP監聽器套接字在accept()上死亡(錯誤24:太多文件)

我正在建立一個UDP到TCP中繼服務器,並取得了一些成功,但下面的情況是我的軟膏中的洋蔥。

讓我先解釋一下工作原理: - 服務器產生,檢查東西並分叉成爲守護進程。 - 在指定的NIC和端口上創建監聽套接字。 - 該套接字接受傳入連接,然後這些連接需要發送HTTP REST請求以指定他們希望從手頭的Linux服務器中繼傳送哪個多播地址。 - 然後處理,等等:)這一切都有效。

事實上這一切工作正常,直到測試以下:

  • 有2級TCP輸出的NIC,1個UDP輸入NIC - >且因此進程運行。
  • 從相同的UDP地址範圍取得120個來自每個(共240個)的輸入。

客戶端應用程序打120,並試圖拉的下一個網卡一樣的快速之一後,不如意的事情從某種意義上說連接到MCAST地址(此代碼證明工作,只是罰款)成功,但沒有收到數據。令客戶非常沮喪,但情況變得更糟。

經過一段時間,第二個進程中的accept()調用產生了錯誤代碼24(文件太多),並且無論我是否關閉了兩個服務器進程的所有未完成連接,它都將繼續執行此無限制廣告。但是,如果我堅持使用120個輸入(我只有120個內部可用的組播),並將80個放在1個服務器卡和TCP NIC上,另一個放40個,這樣就沒有問題了。無論我最近與網絡的東西有什麼不同,我仍然是新手,所以任何人都可以爲我提供一些有用的信息嗎?

非常感謝,如果需要更多的細節/信息/代碼,我會很樂意提供。

+0

您是否檢查過[文件描述符限制](http://stackoverflow.com/a/880573/2802841)不是問題? – user2802841

回答

0

您在某處泄漏連接。確保在讀取數據流結尾或從中獲取錯誤時,它們會在所有可能的代碼路徑中關閉。

+0

謝謝 - 去研究! – nielsj