簡體   English   中英

boost :: asio如何以正確的方式讀取完整緩沖區?

[英]boost::asio how to read full buffer in right way?

我正在學習boost::asio ,現在對於讀取完整緩沖區的正確方法感到困惑。 例如,當建立連接時,我想以下一個方式讀取uint32_t

std::uint32_t size;
size_t len = m_socket.read_some(buffer(&size, sizeof(std::uint32_t)));

如您所見,我設置了緩沖區大小。 在其他情況下,我在read_some數據上收到了len的長度。

所以主要的問題是:如果我在調用buffer設置所需的緩沖區長度時, boost::asio保證會讀取uint32_t所有4個字節嗎?

或者如果不能保證 - 我怎樣才能讀取完整的緩沖區? (全部4個字節)

read_some參考:

此函數用於從流套接字讀取數據。 函數調用將阻塞,直到成功讀取一個或多個字節的數據,或者直到發生錯誤。

備注:

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

所以要么你必須在循環中調用read_some ,要么只調用read ,這將:

阻止,直到滿足下列條件之一:

  • 提供的緩沖區已滿。 也就是說,傳輸的字節數等於緩沖區大小的總和。
  • 發生錯誤。

此操作是根據對流的read_some函數的零次或多次調用實現的。

在您的情況下使用read將是:

std::uint32_t size;
size_t len = read(m_socket, buffer(&size, sizeof(std::uint32_t)));

暫無
暫無

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

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