【问题标题】:Non-Blocking sendto function非阻塞发送功能
【发布时间】:2017-02-09 18:54:30
【问题描述】:

我在我的 cpp 代码中使用阻塞 sendto(标志设置为 0)函数,该函数最多占用 3 微秒,最小占用 600 纳秒。
我想要一个非阻塞的方法(即立即返回)并且花费更少的时间.
我尝试使用将标志设置为 MSG_DONTWAIT 的 sendto,发现非阻塞 sendto 在延迟方面与阻塞 sendto 相似。
请建议一种非阻塞且省时的替代方法.

【问题讨论】:

  • 任何目标操作系统或不可知论者?
  • boost::asio 可能值得一看。

标签: c++ sockets networking latency


【解决方案1】:

... 最大为 3 微秒,最小为 600 纳秒。

这是系统将消息放入涉及系统调用的套接字缓冲区所需的时间。这不包括稍后在内核中完成的发送到对等方本身。这也意味着使用阻塞或非阻塞 sendto 并不重要,因为在这两种情况下都需要将消息放入套接字缓冲区。这也意味着没有selectepollboost::asio 或任何有助于加快速度的东西,因为这些不会减少将消息放入套接字缓冲区所需的时间。

阻塞和非阻塞sendto之间的唯一区别是,第一个将等待系统在套接字缓冲区中腾出空间以防缓冲区已满,即如果您发送消息的速度超过系统可以传递消息的速度.

目前尚不清楚您的应用程序真正做了什么,但加速它的一种方法可能是通过使用更大的消息来减少 sendto 调用的数量。

【讨论】:

    【解决方案2】:

    您需要使用select ()epoll() 类似的技术来确定套接字何时变为可写。如果是 Linux,请查看各自的 man 页面。对于独立于平台的解决方案,您可以查看libevent library。

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 2014-04-24
      • 1970-01-01
      • 2012-08-24
      • 2011-05-25
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多