2014-05-15 58 views
0

我想知道什麼常見的編程情況/錯誤可能會導致服務器進程我已經進入CLOSE_WAIT,但實際上並沒有關閉套接字。常見的編程錯誤會導致在epoll邊緣觸發模式下CLOSE_WAIT卡住?

我想要做的是觸發這種情況,以便我可以修復它。在一個正常的開發環境中,我一直無法觸發它,但在服務器上使用的相同代碼偶爾會得到它們,所以在很多天之後,我們有數百個代碼。

谷歌搜索close_wait,它實際上似乎是一個非常普遍的問題,即使在成熟和所謂寫得好的服務,如nginx。

回答

1

CLOSE_WAIT基本上是當遠程端關閉套接字,但本地應用程序尚未調用其上的close()。這通常發生在你想而不是期望從套接字中讀取數據並因此沒有看到它的可讀性。

爲方便起見,許多應用程序將始終監視套接字以提高可讀性以檢測關閉。

嘗試情景是這樣的:

  1. 端發送數據的2K,並立即關閉數據
  2. 您的插座,然後用epoll的註冊,並得到一個通知可讀性只
  3. 您的應用程序讀取1k的數據
  4. 您停止監視插槽的可讀性
  5. (我不確定邊緣觸發的epoll是否最終將關閉事件作爲單獨事件發送)。

參見:

(從man epoll_ctl

EPOLLRDHUP(因爲Linux 2.6.17) 流套接字同行關閉連接或關閉連接寫的一半。 (此標誌對於編寫 簡單代碼 以在使用邊沿觸發監視時檢測對等關閉特別有用。)