【问题标题】:Non-Blocking sendto function非阻塞发送功能
【发布时间】:2017-02-09 18:54:30
【问题描述】:
我在我的 cpp 代码中使用阻塞 sendto(标志设置为 0)函数,该函数最多占用 3 微秒,最小占用 600 纳秒。
我想要一个非阻塞的方法(即立即返回)并且花费更少的时间.
我尝试使用将标志设置为 MSG_DONTWAIT 的 sendto,发现非阻塞 sendto 在延迟方面与阻塞 sendto 相似。
请建议一种非阻塞且省时的替代方法.
【问题讨论】:
标签:
c++
sockets
networking
latency
【解决方案1】:
... 最大为 3 微秒,最小为 600 纳秒。
这是系统将消息放入涉及系统调用的套接字缓冲区所需的时间。这不包括稍后在内核中完成的发送到对等方本身。这也意味着使用阻塞或非阻塞 sendto 并不重要,因为在这两种情况下都需要将消息放入套接字缓冲区。这也意味着没有select、epoll、boost::asio 或任何有助于加快速度的东西,因为这些不会减少将消息放入套接字缓冲区所需的时间。
阻塞和非阻塞sendto之间的唯一区别是,第一个将等待系统在套接字缓冲区中腾出空间以防缓冲区已满,即如果您发送消息的速度超过系统可以传递消息的速度.
目前尚不清楚您的应用程序真正做了什么,但加速它的一种方法可能是通过使用更大的消息来减少 sendto 调用的数量。
【解决方案2】:
您需要使用select () 或epoll() 类似的技术来确定套接字何时变为可写。如果是 Linux,请查看各自的 man 页面。对于独立于平台的解决方案,您可以查看libevent library。