编辑:问题解决了,我之前错误地在服务器套接字上调用了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正在进行。
答案 0 :(得分:0)
手册页上写着:
[EAGAIN]套接字被标记为非阻塞和接收 操作将阻止,或已设置接收超时,并且超时在数据之前到期 接收。
注意"超时"一部分。
答案 1 :(得分:0)
我发现了我的错误:
我打电话给fcntl(fd,F_SETFL,FD_CLOEXEC);当我应该使用F_SETFD这个标志时: - (
我不知道这是如何映射到包含O_NONBLOCK的掩码 - 因为它们具有不同的值 - 但这就是发生的事情。
感谢您的时间。