sockets - Boost 异步 UDP 客户端

标签 sockets boost asynchronous udp boost-asio

我已经通读了 boost:asio 文档(在异步客户端上显示为无声),并浏览了这里,但似乎找不到这里的树木。

我有一个模拟,它的主循环如下所示:

for(;;)
{
  a = do_stuff1();
  do_stuff2(a);
}

很简单。

我想做的是修改它,以便我拥有:

for(;;)
{
  a = do_stuff1();
  check_for_new_received_udp_data(&b);
  modify_a_with_data_from_b(a,b);
  do_stuff2(a);
}

我有以下要求:

  1. 我不能因为没有积极倾听而丢失数据。 IE 我不想丢失数据包,因为服务器发送数据包时我处于 do_stuff2() 而不是 check_for_new_received_udp_data() 中。
  2. check_for_new_received_udp_data() block 的时间不能超过 2 毫秒,因为主 for 循环需要以 60Hz 执行。
  3. 服务器将在其他地方运行,并且时间表完全不稳定。有时会没有数据,有时我可能会重复收到相同的数据包。

我已经使用了异步 UDP,但这需要调用 io_service.run(),它会无限期地阻塞,所以这对我没有真正的帮助。

我考虑过让阻塞套接字读取超时,但似乎你必须作弊并退出 boost 调用才能做到这一点,所以这是不可能的。

答案是否涉及线程?不管怎样,有人能给我指出一个有点相似的例子吗?当然,这之前已经做过了。

最佳答案

为了避免在 io_service::run() 中阻塞,您可以使用 io_service::poll_one()

关于丢失 UDP 数据包,我认为你运气不好。 UDP 不保证传送,如果流量很大,网络的任何部分都可能决定丢弃 UDP 数据包。如果您需要确保交付,则需要实现某种流量控制或仅使用 TCP。

关于sockets - Boost 异步 UDP 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15603544/

相关文章:

c - 通过c中的套接字传递wav文件样本

javascript - 在node.js和socket.io中向单个套接字发送消息

c++ - 在Windows窗体c++/cli程序中为已定义的标识符获取未定义的标识符错误

javascript - Nodejs 监听来自 http.get() 的数据事件的响应流

asynchronous - 如何正确地等到 future 在 Dart 中完成

javascript - 如何确保在循环完成后执行语句?

python - Django和Socket服务器: Can I add socket server instance to “memory” ?

java - 从服务器端关闭 TCP 连接,同时通知客户端

c++ - 为什么 std::result_of 将(不相关的)函数类型作为类型参数?

c++ - 将 ASIO 链接到项目而不在 Visual Studio 中 boost