編輯:問題解決了,我之前在服務器套接字上錯誤地調用了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進行。
可能重複[阻塞套接字返回EAGAIN](http://stackoverflow.com/questions/735249/blocking-socket-returns-eagain) – 2011-03-28 03:17:38