簡體   English   中英

Boost.Asio什么時候調用async_read_some回調?

[英]when does Boost.Asio call async_read_some callbacks?

可以說我有一個Boos.Asio TCP客戶端,它可以發送一個字符串,如下所示:

client.sendStr("1111");

我也有一個異步Boost.Asio TCP服務器,它將處理傳入的數據包並進行打印,如下所示:

received string: "1111", size: 5.

問題是,當我多次調用client.sendStr() ,像這樣

client.sendStr("1111");
client.sendStr("2222");
client.sendStr("3333");

我可能會在服務器端得到各種結果,例如:

received string: "1111", size: 5.
received string: "2222", size: 5.
received string: "2222", size: 5.

要么

received string: "111122223333", size: 13.

要么

received string: "11112222", size: 9.
received string: "3333", size: 5.

我是網絡新手,但我想這種情況的原因是TCP是“基於流的協議”。

我的問題是:

1)我可以阻止Boost.Asio這樣做嗎? (讓我們說“ 1111”和“ 2222”是我的應用程序的控制數據包,但我沒有連接它們)。

2)有沒有可能我會收到這樣的回調:

received string: "111122", size: 7.
received string: "22333", size: 6.
received string: "3", size: 2.

async_read_some文檔非常清楚:

備注

讀取操作可能無法讀取所有請求的字節數。 如果需要確保在異步操作完成之前讀取請求的數據量,請考慮使用async_read函數。

TCP是基於流的協議,您將需要在應用程序層處理消息幀。 這在很大程度上取決於您的協議,在您的方案中,一種可能的解決方案可能是使每個消息都為空。 或者,在每個指示有效載荷長度的消息之前包括一個固定的字節頭。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM