[英]boost::asio packet order and contiguity
我正在使用boost::asio::ip::tcp::socket
在客戶端/服務器應用程序中發送和接收數據。 我使用簡單的自制數據包,包括一個包含數據包大小的標頭,一些標志和“實際”數據。 我使用boost::asio::write
發送數據包。 在某些情況下,我有很多數據包要發送給一個客戶端。 天真最快的選擇是一次將它們全部發送出去。 例如
async_write(socket, buffer(p[0].str(),p[0].size()), &callback);
async_write(socket, buffer(p[1].str(),p[1].size()), &callback);
async_write(socket, buffer(p[2].str(),p[2].size()), &callback);
但是,如果我這樣做,是否可以保證我的數據包整體到達客戶端? 因此,在此示例中,如果數據包的前4個字節代表其余數據包的大小,我可以調用四次
uint32 size;
read(socket, buffer(&size,4));
char data[size];
read(socket, buffer(data,size));
並確保每個data
包含一個數據包(尺寸為uint32的appart)? 還是如果我在回調函數中發送下一個數據包,它將起作用嗎?
如果這一事實起作用,那么另一個問題就是有關訂購的問題。 我可以確定數據包到達客戶端的順序與我從服務器發送的順序相同嗎?
首先,TCP套接字對數據流(而不是數據包)進行操作。 其次, async_write()
文檔明確指出每個套接字可以執行一個未完成的操作:
此操作是通過對流的
async_write_some
函數的零次或多次調用來實現的,並且被稱為組合操作。 程序必須確保該流完成之前,該流不執行其他任何寫操作(例如async_write
,流的async_write_some
函數或任何其他執行寫操作的組合操作)。
您將需要鏈接您的操作:僅在調用第一個操作的完成處理程序之后,才調用第二個async_write()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.