2011-03-28 166 views
0

編輯:問題解決了,我之前在服務器套接字上錯誤地調用了fcntl(sock,F_SETFL,FD_CLOEXEC)。這不知何故被映射到包含O_NONBLOCK的掩碼,因爲FD_CLOEXEC用於F_SETFD,而不是F_SETFL,並且也被繼承到客戶端套接字。OSX上的虛假recv()EAGAIN?

你好,

我正在Mac OS X 10.4上開發網絡應用程序。這裏發生了一些奇怪的事情:有時 - 相當經常和可靠 - 對阻塞TCP套接字的recv()操作返回-1,並將errno設置爲EAGAIN。

這很奇怪,因爲如前所述,它是一個阻塞套接字。我也沒有設置任何接收超時 - 作爲文檔狀態也可以導致EAGAIN返回。我使用getsockopt()來驗證沒有超時。如果我打了一個usleep()並再次調用recv(),那麼我得到的數據就是下一個數據。

有沒有人在OSX上專門或在其他系統上遇到過這個問題?

這個應用程序非常簡單。它是單線程的,不使用信號,沒有異步I/O進行。

+0

可能重複[阻塞套接字返回EAGAIN](http://stackoverflow.com/questions/735249/blocking-socket-returns-eagain) – 2011-03-28 03:17:38

回答

0

手冊頁讀取:

[EAGAIN]套接字被標記無阻塞,並且接收 操作會阻塞,或接收超時已被設定,並且超時數據過期之前收到了 。

請注意「超時」部分。

+0

就像我說的,沒有超時設置。就像我說的,我使用getsockopt()驗證了這一點,它看起來像O_NONBLOCK被設置,但我沒有在任何地方請求O_NONBLOCK。 – gnu 2011-03-28 03:20:00

0

,我發現我的錯誤:

我打電話使用fcntl(fd,F_SETFL,FD_CLOEXEC);當我應該用F_SETFD這個標誌:-(

我不知道這是怎麼精確匹配含有O_NONBLOCK面具 - 因爲他們有不同的價值觀 - 但這是發生了什麼事

謝謝您時間