一次性多个Boost :: ASIO async_send_to

时间:2017-08-10 03:04:09

标签: c++ sockets boost udp asio

我想提高使用Boost ASIO的udp游戏服务器的吞吐量。 现在,每次我需要发送一个数据包,我把它放入一个队列,然后检查是否有一个挂起的async_send_to操作,如果是的话,什么都不做,如果没有,请调用async_send_to。 然后我等待写入处理程序被调用,然后为队列中的下一个数据包调用async_send_to(如果有的话)。

文档说它是“用于TCP套接字”的方法,但整个互联网上都没有关于UDP套接字的内容。 尝试一下,在stackoverflow上搜索它,你会看到没有人谈论这个问题,对于你会发现的两个问题,用户会忽略这个问题。

为什么保密? 对于100万美元的问题,我可以安全地连续多次调用async_send_to而不等待写入处理程序被调用吗?

提前致谢。

2 个答案:

答案 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消息队列和使用收集的写入来增加吞吐量......