[英]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.