我现在正在使用一个应用程序,该应用程序主要使用带有
select()
超时的阻塞套接字,但通过 Write 函数,我使用带有 send()
的非阻塞套接字。我只需要知道,在什么(以及所有)情况下send()
会返回EWOULDBLOCK
/EAGAIN
?
send()
的 Linux 手册页说:
当消息无法放入套接字的发送缓冲区时, send() 通常会阻塞,除非套接字已放入 非阻塞 I/O 模式。在非阻塞模式下,它将失败并出现错误 在本例中为 EAGAIN 或 EWOULDBLOCK。 select(2) 调用可用于 确定何时可以发送更多数据。
和
返回值 EAGAIN 或 EWOULDBLOCK:套接字被标记为非阻塞并且 请求的操作将被阻止。 POSIX.1-2001 允许任一错误 在这种情况下会被返回,并且不需要这些常量 具有相同的值,因此便携式应用程序应该检查两者 可能性。