2010-01-25 313 views
4

好吧..我使用epoll + multithread的典型模型來處理大量的套接字,也就是說,我有一個線程叫做epollWorkThread,它使用epoll_wait來處理I/O插座。雖然有EPOLLIN事件,recv()將完成這項工作,並且我使用非鎖定模式來允許立即返回。而recv()確實是在一段時間(true)循環中。 在初始時間(可能是幾個小時或者幾分鐘,或者如果我很幸運的話),一切都很好,我可以收到信息。但過了一段時間,recv()堅持返回-1,errno = 107(ENOTCONN)。傳輸的另一端用AS3編寫,確保插座已連接。所以我對recv()的行爲感到困惑。預先感謝您的意見,並表示感謝!recv()與errno = 107 :(運輸端點連接)

+0

沒有答案,因爲我不知道發生了什麼,但嘗試使用網絡監視器來獲取更多信息。我使用tcpdump或wireshark,任何更方便。不要忘記檢查你的代碼,看看腐敗是否可能導致這個問題(valgrind)。 – stefaanv 2010-01-25 11:59:57

+0

感謝您的信息。我嘗試了tcpdump,但未能知道如何捕獲數據包。我試過「tcpdump -i eth0'port myportnum'」但它不會捕獲任何東西... – iBacchus 2010-01-26 07:12:08

+0

你確定關於eth0嗎?檢查「ip地址」。你有沒有嘗試過它作爲根?也許你沒有正確的許可。 參數沒問題,雖然我也加了-s0和-wtrace.cap,所以我可以用wireshark查看它。 – stefaanv 2010-01-26 12:14:42

回答

3

errno 107意味着插座是不是連接(任何更多)。 這可能發生的原因有幾個。假設你是對的,並且連接的兩端都聲稱套接字仍處於打開狀態,則中間路由器/交換機可能由於超時而斷開連接。避免發生這種事情的最安全的方法是定期發送「健康」或「保持活躍」的信息。 (因此,中間路由器/交換機接受連接作爲生活...)=

相關問題