簡體   English   中英

C ++異步網絡編程

[英]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,重復此過程,直到您有足夠的字節或死了。

我不確定“無法閱讀所有內容”的意思。 我想到了兩種可能的含義:

  1. 可讀取的數據量未填充結構。 在這種情況下,您只需執行另一個read_async即可等待更多數據到達。
  2. 該結構不會吸收所有已到達的數據。 TCP堆棧將僅緩沖未讀的數據,直到您開始閱讀為止。

暫無
暫無

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

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