2017-08-10 98 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

這取決於你需要傳輸多少數據,你的以太網幀有多大,等等,但是它會盡量使它儘可能少的數據報。 –