我想提高使用Boost ASIO的udp游戏服务器的吞吐量。 现在,每次我需要发送一个数据包,我把它放入一个队列,然后检查是否有一个挂起的async_send_to操作,如果是的话,什么都不做,如果没有,请调用async_send_to。 然后我等待写入处理程序被调用,然后为队列中的下一个数据包调用async_send_to(如果有的话)。
文档说它是“用于TCP套接字”的方法,但整个互联网上都没有关于UDP套接字的内容。 尝试一下,在stackoverflow上搜索它,你会看到没有人谈论这个问题,对于你会发现的两个问题,用户会忽略这个问题。
为什么保密? 对于100万美元的问题,我可以安全地连续多次调用async_send_to而不等待写入处理程序被调用吗?
提前致谢。
答案 0 :(得分:1)
这种逻辑对UDP协议毫无意义,因为它不需要阻止发送操作。数据报要么已传送,要么丢失。 UDP不必将其存储在输出缓冲区中并无限次重新发送多次,直到获得ACK数据包。
答案 1 :(得分:1)
不,你不能安全地连续多次调用async_send_to
而不等待调用写入处理程序。请参阅Asynchronous IO with Boost.Asio以了解原因。
但是,asio
支持scatter gather,因此您可以使用多个缓冲区调用async_send_to
,例如:
typedef std::deque<boost::asio::const_buffer> ConstBuffers;
std::string msg_1("Blah");
...
std::string msg_n("Blah");
ConstBuffers buffers;
buffers.push_back(msg_1);
...
buffers.push_back(msg_n);
socket_.async_send_to(buffers, tx_endpoint_, write_handler);
因此,您可以通过double buffering
消息队列和使用收集的写入来增加吞吐量......