我已经通读了 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);
}
我有以下要求:
- 我不能因为没有积极倾听而丢失数据。IE 我不想丢失数据包,因为在服务器发送数据包时我在 do_stuff2() 而不是 check_for_new_received_udp_data() 中。
- 我不能让 check_for_new_received_udp_data() 块超过大约 2 毫秒,因为主 for 循环需要以 60Hz 执行。
- 服务器将在其他地方运行,并且有一个完全不稳定的时间表。有时会没有数据,有时我可能会重复收到相同的数据包。
我玩过异步 UDP,但这需要调用 io_service.run(),它会无限期地阻塞,所以这对我没有帮助。
我考虑过超时阻塞套接字读取,但似乎你必须作弊并退出 boost 调用才能做到这一点,所以这是一个非首发。
答案会涉及线程吗?无论哪种方式,有人可以指出一个有点相似的例子吗?当然,这在以前已经做过了。