[英]C++ asynchronous network programming
我有一些簡單的問題,我有一個客戶端服務器應用程序和在線發送的數據。
我希望能夠恢復數據並正確處理它。
struct T1
{
int id;
int foo;
};
struct T2
{
int id;
char foo;
int bar;
};
讓我們采用這些結構,它們是在網絡上發送的,前面是一個整數,該整數將指示是否跟隨T1或T2。 如果客戶端向我發送了T1,然后向我發送了T2,我是否可以保證可以使用asio :: ip :: tcp :: socket.async_read()讀取完整的結構? 我想設置一個處理單個結構的處理程序,但是如果我無法在單個async_read()中讀取所有內容,將會發生什么?
異步操作將繼續,直到滿足以下條件之一:
- 提供的緩沖區已滿。 即,傳輸的字節等於緩沖區大小的總和。
- 發生錯誤。
它會丟棄無法讀取的數據嗎? 它會觸發另一個async_read嗎? 而且,如果我的客戶按順序向我發送ID +結構,我是否可以確保async_read僅會獲得一個ID +結構? 還是操作系統可以優化事情,然后將它們放在同一塊地板上? 如您所見,我有些困惑,我想在設計服務器/客戶端應用程序時做出正確的決定,我們將不勝感激。
謝謝。
編輯:感謝@timo指出一個錯誤。 在讀取整個結構之前,async_read不會完成,因此您無需循環。 否則,我的答案是相同的。 無論TCP協議如何分解或合並數據,都不會丟失任何內容。
如果TCP緩沖區中的數據不足以填充您的輸入緩沖區,則讀取操作將簡單地獲取所有可用數據,並報告獲取的字節數。 接下來會發生什么取決於您。 您可能在所提取的字節中有足夠的數據來確定您不想繼續,因此asio不作任何假設。 如果您沒有讀取足夠的字節來構成一個完整的結構,請啟動另一個async_read,重復此過程,直到您有足夠的字節或死了。
我不確定“無法閱讀所有內容”的意思。 我想到了兩種可能的含義:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.