2011-01-22 201 views
3

我有我在Linux和iPhone上的套接字級編寫的跨平臺代碼。它打開非阻塞套接字並連接到服務器。除非有時當客戶端/服務器之一斷開連接,在recv或發送呼叫期間通過SIGPIPE在另一端暫停執行程序時,一切都很好。如何檢測TCP連接丟失?

這很有道理。在Linux上,我可以使用一個標誌來向操作系統庫指示不要引發SIGPIPE - 然後我可以自己察覺錯誤並且乾淨地處理它。這工作正常

然而,在iPhone OS(和大概是我後來關心的OSX)沒有標誌表明不投SIGPIPE。我可以做信號(SIGPIPE,IGN);這似乎通常停止它,但仍然有時我得到它? (這可能是由於我設置了信號處理的位置 - 我可能只會在應用程序啓動時執行此操作,而我可能必須在每次應用程序變爲活動狀態時執行此操作)

這一切都讓我感覺像我一樣是否以錯誤的方式捕捉斷開連接 - 我應該使用select()還是朋友來檢測斷開連接是否已經發生?具體怎麼做?

回答

1

你真的應該用Google搜索一下(例如,this page)。總之,嘗試使用SO_NOPIPE套接字選項以及您已經嘗試過的選項。