2
我有具有以下回路中的應用:有沒有辦法在處理之前接收所有數據包?
void receive() {
socket.async_receive_from(asio::buffer(buffer,buffer_len),recv_endpoint,
[&)(const ec& error, size_t recvd_len) {
if(error) throw error;
new_packet(buffer,recvd_len);
handle_received();
receive();
});
};
什麼情況是,我的handle_received()
功能很慢,當它結束時,已經有大量的UDP緩衝區等待包。我想要實現的是首先獲得所有可用的東西,然後只調用一次handle_received()
。
您使用TCP套接字嗎?然後更糟,因爲TCP是一個流媒體協議,任何接收呼叫都可以給你任何數量的數據。你可以做的是在處理程序(lambda)中將數據保存在緩衝區中,並保持接收的總字節數,當總大小超過閾值時,處理存儲的緩衝區中的數據。 – 2014-09-10 08:46:50
@JoachimPileborg它是UDP。我不想遵循閾值方法,因爲我想盡量減少延遲。我目前的問題是,我正在丟失數據包,因爲代碼可以'接收'足夠快。 – 2014-09-10 08:48:36
如果你使用UDP和鬆散數據包,你可能需要在UDP之上實現一個類TCP協議來處理丟失數據包的重發(也可能是排序)。 – 2014-09-10 08:51:10