【问题标题】:Blocking vs. nonblocking UDP socket for single host单个主机的阻塞与非阻塞 UDP 套接字
【发布时间】:2011-09-12 17:49:13
【问题描述】:

我正在编写一个从单个发送方接收 UDP 数据报的客户端。所有 IO 都将在单个线程中完成。通常,要么没有数据,要么有 30 MBit/s 的流。我主要关心的是保持尽可能低的延迟。

计划是阻塞,等待数据,在一个短暂的超时循环中,以便 IO 线程可以响应关闭请求等。

我倾向于使用阻塞套接字,为其设置超时,然后调用recvfrom()。但是,这似乎比非阻塞套接字上的 select()/poll()recvfrom() 组合要少得多。

鉴于我只使用单个套接字,似乎非阻塞方法不必要地复杂。我还缺少其他东西吗?在这种特殊情况下是否有理由更喜欢非阻塞套接字?

【问题讨论】:

  • 您甚至不需要超时 - 您可以向您的接收线程发送信号以使 recvfrom() 立即返回 errno == EINTR

标签: c sockets udp nonblocking latency


【解决方案1】:

如果你有一个专门的线程来处理套接字,那么异步 I/O、select 等都是无用的。您想要的只是recvfrom(2) 并尽快处理数据。

任何花哨的机制(epolllibaio 等)都无法帮助您提高应用程序的速度。

【讨论】:

  • 没错,它们不会帮助您提高速度,但它们确实可以帮助您扩展。最终,您可能会进行足够的扩展以提供更多吞吐量。现在是记住速度的好时机!= 吞吐量。
  • @Edwin: select 及其同类无法帮助您扩展只有一个套接字的 UDP 服务器。
【解决方案2】:

只有几个对等点,(并且“一个”肯定在这个集合中:),一个带有阻塞套接字的线程应该没问题。代码更容易编写,因为可以在专用线程中维护状态 - 不需要非阻塞系统通常需要的状态机。

短超时 - 你需要这个吗?你在应用关闭之前关闭这个子系统吗?如果没有,你能不能让它被操作系统杀死?

如果您必须关闭线程系统,您可以设置一些“终止”标志并向自己发送一条 UDP 消息以解除对线程的阻塞,以便它意识到它必须死掉。

Rgds, 马丁

【讨论】:

  • 哦...对...无连接协议使发送终止数据包之类的事情变得容易。当然。我喜欢。谢谢。
  • 该死,我一直在寻找一种方法来终止我的阻塞接收线程命令,我什至没有考虑给自己发送一个数据包。这是一个很好的解决方法,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多