2017-09-09 37 views
2

野獸的WebSocket例如存儲在一個多緩衝中的數據:試圖瞭解了boost ::獸多緩衝

實現使用一個或多個字符數組大小不等的 的序列。附加的字符數組對象被附加到 該序列以適應字符大小的變化 序列。

當看着界面,它不是完全清楚它是如何工作的。如果我閱讀這些描述,它可以看作是一組緩衝區。但看起來輸出只是一塊數據。這是否意味着「一個或多個陣列」只適用於內部結構?

在該示例代碼的數據被讀入緩衝區如下:m_websocketStream.async_read(m_buffer.....

是否每個async_read操作創建一個新的內部緩衝器。

如果是這種情況,如何解釋它的另一端。例如。如何將它讀入std :: string或std :: vector。

查看源數據()時,會返回前向聲明const_buffer_type。

對於數據部件的幫助信息提供了以下信息,這是有很大幫助不:

用來表示輸入序列作爲緩衝區的列表的類型。 使用const_buffers_type = implementation_defined;

該定義似乎來自頭文件boost/asio/buffer.hpp也包括在內。然而整體結構對我來說有些模糊。

我只是試圖瞭解如何處理數據作爲字節或將其轉換爲std :: string。

試過以下,而這也是不允許的:

std::string(boost::asio::buffer_cast<const char*>(m_buffer.data()) ,boost::asio::buffer_size(m_buffer.data()));

任何人誰可以告訴我一下?

回答

3

data()返回滿足ConstBufferSequencehttp://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/reference/ConstBufferSequence.html)的要求的對象。如果你想一個緩衝序列轉換成prepare()返回一個對象滿足要求MutableBufferSequencehttp://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/reference/MutableBufferSequence.html

所有在獸動態緩衝區的滿足要求DynamicBuffer,在http://www.boost.org/doc/libs/develop/libs/beast/doc/html/beast/concepts/DynamicBuffer.html

描述字符串你需要遍歷每個元素,並將其附加到單獨的字符串。這樣的功能可能是這樣的:

template<class ConstBufferSequence> 
std::string 
to_string(ConstBufferSequence const& buffers) 
{ 
    std::string s; 
    s.reserve(boost::asio::buffer_size(buffers)); 
    for(boost::asio::const_buffer b : buffers) 
     s.append(boost::asio::buffer_cast<char const*>(b), 
      boost::asio::buffer_size(b)); 
    return s; 
} 

另外,如果你想避免緩衝區拷貝,你可以使用類似beast::flat_buffer這可以保證所有的緩衝序列的長度是一個。事情是這樣的:

inline 
std::string 
to_string(beast::flat_buffer const& buffer) 
{ 
    return std::string(boost::asio::buffer_cast<char const*>(
     beast::buffers_front(buffer.data())), 
      boost::asio::buffer_size(buffer.data()); 
} 

有關緩衝區的詳細信息,請參閱http://www.boost.org/doc/libs/1_65_0/doc/html/boost_asio/overview/core/buffers.html

+0

我認爲最後一個例子中有一個錯字。我認爲它應該是beast :: buffers_front(...) – Jakob

+0

是的,我將這個函數重命名爲'buffers_front'作爲一組更改的一部分,以使所有名稱一致。我編輯了示例代碼 –

1

在野獸的最新版本,現在的功能buffers_to_string將在一個函數調用爲你做這個。