OSX上的虚假recv()EAGAIN?

时间:2011-03-28 03:12:36

标签: macos

编辑:问题解决了,我之前错误地在服务器套接字上调用了fcntl(sock,F_SETFL,FD_CLOEXEC)。这不知何故被映射到包含O_NONBLOCK的掩码,因为FD_CLOEXEC用于F_SETFD,而不是F_SETFL,并且也被继承到客户端套接字。

您好,

我正在Mac OS X 10.4上开发网络应用程序。这里发生了一些奇怪的事情:有时 - 非常有规律和可靠 - 阻塞TCP套接字上的recv()操作返回-1,并将errno设置为EAGAIN。

这很奇怪,因为如上所述,它是一个阻塞套接字。我也没有设置任何接收超时 - 因为文档状态也可以导致EAGAIN返回。我使用getsockopt()来验证没有超时。如果我再次使用usleep()并再次调用recv(),那么我可以获得下一个数据的数据。

有没有人在OSX上或其他系统上遇到过这个问题?

这个应用程序非常简单。它是单线程的,不使用信号,没有异步I / O正在进行。

2 个答案:

答案 0 :(得分:0)

手册页上写着:

  

[EAGAIN]套接字被标记为非阻塞和接收   操作将阻止,或已设置接收超时,并且超时在数据之前到期   接收。

注意"超时"一部分。

答案 1 :(得分:0)

我发现了我的错误:

我打电话给fcntl(fd,F_SETFL,FD_CLOEXEC);当我应该使用F_SETFD这个标志时: - (

我不知道这是如何映射到包含O_NONBLOCK的掩码 - 因为它们具有不同的值 - 但这就是发生的事情。

感谢您的时间。