【发布时间】:2011-03-28 03:12:35
【问题描述】:
编辑:问题已解决,我之前在服务器套接字上错误地调用了 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。
【问题讨论】:
标签: macos