2017-08-10 93 views
1

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

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

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

在此先感谢。

回答

1

这个逻辑对UDP协议没有意义,因为它不需要阻塞发送操作。数据报不是交付就是丢失。 UDP不必将其存储在输出缓冲区中并无限次地重新发送,直到获得ACK数据包。

+0

所以为了确保,我能够在一行中调用所有async_send_to,而不必等待写入处理程序被调用,当然保持缓冲区有效直到处理程序被调用? – NoobyLearner

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

+0

分散集合是否将所有缓冲区作为单个数据报发送? – sehe

+1

这取决于你需要传输多少数据,你的以太网帧有多大,等等,但是它会尽量使它尽可能少的数据报。 –