【问题标题】:Will send() ever block when using select()?使用 select() 时 send() 会阻塞吗?
【发布时间】:2012-02-11 00:18:48
【问题描述】:

当通过调用select() 指示套接字可以写入时,我如何知道可以发送多少数据而不阻塞? (在完整发送缓冲区等的情况下)

包含在select() 返回的集合中是否表示套接字已准备好接收至少一个字节的数据,并且send() 然后会返回一小段写入字节数?

或者当我使用大于可用缓冲区空间的len 参数调用send() 时它会阻塞吗?如果是,我怎么知道最大金额?

我在 Linux 上使用常规 C 套接字。

【问题讨论】:

  • 如果您的 API 支持它,您可以使用 SO_SNDLOWAT 选项。这样您就可以选择需要可写的最小字节数。

标签: c sockets select


【解决方案1】:

send 调用不应在第一次调用时阻塞,并且应在第一次调用时发送至少一个字节——假设您使用的是流协议并假设它没有被信号中断等。但是,有实际上只有两种方法可以确定您可以发送多少数据:

  1. 在每次调用send 后调用select,看看是否可以发送更多数据。

  2. 将套接字置于非阻塞模式,并调用send,直到它给出EAGAINEWOULDBLOCK 错误。

首选第二个选项。 (第三种选择是在不同的线程中执行,简单地让线程阻塞,这也是一个很好的解决方案。过去,线程实现并不成熟,因此非阻塞模式被认为是高性能所必需的服务器。)

【讨论】:

  • +1 表示第二个选项,这也是很常见的做法。
  • 为什么首选 2?我认为解释或参考会大大改善这个答案。另外,你不能两者都做吗?
【解决方案2】:

你无法知道。您必须将套接字发送为非阻塞,然后注意返回值告诉您它已经写入了多少。

【讨论】:

    猜你喜欢
    • 2015-04-30
    • 2011-07-18
    • 1970-01-01
    • 2023-03-19
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多