【问题标题】:When will send() return EWOULDBLOCK? [closed]send() 什么时候返回 EWOULDBLOCK? [关闭]
【发布时间】:2016-07-08 12:29:38
【问题描述】:

我现在正在使用一个应用程序,该应用程序主要使用带有 select() 超时的阻塞套接字,但是对于 Write 函数,我正在使用带有 send() 的非阻塞套接字。我只需要知道,在什么(以及所有)情况下 send() 会返回 EWOULDBLOCK/EAGAIN?

【问题讨论】:

  • 我不确定我是否理解这个问题,或者您可能不理解文档。如果套接字处于非阻塞模式并且调用会因任何原因阻塞,send() 将返回 EAGAINEWOULDBLOCK。规范没有更详细地介绍,并且无论如何细节都将是特定于实现的。对于某些实现,这意味着发送缓冲区中没有足够的可用空间来容纳整个消息,但缓冲细节同样是特定于实现的。
  • @JohnBollinger 对于所有实现。文档中提到了发送缓冲区。它们不是实现细节。

标签: c sockets networking send nonblocking


【解决方案1】:

send() 的 Linux 手册页说:

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

返回值 EAGAIN 或 EWOULDBLOCK:套接字标记为非阻塞,并且 请求的操作会阻塞。 POSIX.1-2001 允许任一错误 在这种情况下返回,并且不需要这些常量 具有相同的值,因此可移植应用程序应检查两者 可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2010-10-17
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多