2011-06-22 101 views
3

我正在使用epoll進行網絡編程。我有一個連接列表並將每個客戶端放入列表中。如果用戶正常斷開連接,則可以通過讀取0來檢測用戶斷開連接。但是,如果用戶以某種方式意外斷開連接,則在嘗試將數據發送給用戶之前,無法知道這一點。如何檢查客戶端連接是否還活着

我不認爲epoll提供了一個很好的方式來處理這個..所以我認爲我應該自己處理這個問題。如果你們能向我提供任何有關此問題的例子或參考資料,我將非常感激。

回答

5

如果對方斷開連接,epoll_wait將爲套接字返回EPOLLHUP或EPOLLERR。 EPOLLHUP和EPOLLERR會自動設置,但您也可以設置顯式報告對等關機的較新的EPOLLRDHUP。

此外,如果您使用帶標誌MSG_NOSIGNAL的發送,它將在關閉的連接上設置EPIPE。

int resp = send(sock,buf,buflen,MSG_NOSIGNAL);

如果(分別== -1 & &錯誤號== EPIPE){/ *另一側消失* /}

比得到的信號的效果好很多。

+1

它實際上是'EPOLLRDHUP',見http://www.kernel.org/doc/man-pages/online/pages/man2/epoll_ctl.2.html –

+0

是的,EPOLLRDHUP是更好的選擇。 –

+0

@MartinRedmond我讀到了有關使用EPOLLRDHUP的類似解決方案,但這在我的系統中不起作用。它是未定義的,但是在我定義它之後它仍然不起作用。我的內核版本是3.2.0-38-通用的。 – polerto

相關問題