2016-03-21 188 views
1

我正在使用主要使用select()超时阻塞套接字的应用程序,但是使用Write函数,我正在使用send()的非阻塞套接字。我只需要知道,在什么(和所有)情况下会发送()返回EWOULDBLOCK/EAGAIN?什么时候send()会返回EWOULDBLOCK?

+1

我不确定我是否理解这个问题,否则可能你不理解文档。如果套接字处于非阻塞模式,则send()将返回EAGAIN或EWOULDBLOCK,并且由于某种原因该调用将被阻塞。规范没有更详细的说明,细节在任何情况下都是特定于实现的。对于某些实现来说,这意味着发送缓冲区中没有足够的可用空间来容纳整个消息,但缓冲区细节又是实现特定的。 –

+1

@JohnBollinger对于所有实现。文档中提到了发送缓冲区。它们不是实现细节。 – EJP

回答

2
send()

Linux手册页说:

当消息不适合套接字的发送缓冲区, 的send()正常块,除非插座被放置在 非阻塞I/O模式。在非阻塞模式下,在这种情况下,它将失败,并出现EEGAIN或EWOULDBLOCK错误 。 select(2)调用可用于确定何时可以发送更多数据。

返回值EAGAIN或EWOULDBLOCK:套接字被标记非阻塞和 请求的操作将阻止。 POSIX.1-2001允许任一错误以 作为这种情况返回,并且不要求这些常量以 具有相同的值,因此便携式应用程序应该检查两个 的可能性。

相关问题