簡體   English   中英

Boost.Asio-具有自定義緩沖區的多個緩沖區

[英]Boost.Asio - Multiple buffers with custom buffer

我正在寫一種tcp服務器。 我正在使用帶有shared_const_buffer的 Boost.Asio。

現在,我必須編寫多個緩沖區。 所以我這樣寫:

std::vector<shared_const_buffer> bufs;
bufs.push_back(buf1);
bufs.push_back(buf2);
...
boost::asio::async_write(*pSock, bufs, [] { ... });

但是,我可以看到一個錯誤。

d:\\ boost_1_56_0 \\ boost \\ asio \\ detail \\ using_buffers.hpp(175):錯誤C2679:이'=':展開“ shared_const_buffer”。

好吧,我的Visual Studio不是英語版本> o <這是我的翻譯

d:\\ boost_1_56_0 \\ boost \\ asio \\ detail \\ using_buffers.hpp(175):錯誤C2679:二進制運算符'=':沒有使用shared_const_buffer類型作為右側的運算符或允許的轉換。

我不確定我的翻譯是否正確,但是我認為你可以理解。 無論如何,我看到了boost\\asio\\detail\\consuming_buffers.hpp(175)出問題所在。

if (!at_end_)
{
  first_ = *buffers_.begin(); // <-- here's error point
  ++begin_remainder_;
}

因此,我嘗試將Casting運算符添加到shared_const_buffer ,它神奇地工作。

這是我的mcve

#include <iostream>
#include <vector>
#include <memory>

#include <boost/asio.hpp>

using boost::asio::ip::tcp;

class shared_const_buffer
{
private:
    std::shared_ptr<std::vector<char> > m_pData;
    boost::asio::const_buffer m_buffer;

public:
    explicit shared_const_buffer(const std::vector<char> &data)
        : m_pData { std::make_shared<std::vector<char> >(data) }
        , m_buffer { boost::asio::buffer(*m_pData) }
    {

    }

    typedef boost::asio::const_buffer value_type;
    typedef const boost::asio::const_buffer *const_iterator;
    const boost::asio::const_buffer *begin() const { return &m_buffer; }
    const boost::asio::const_buffer *end() const { return &m_buffer + 1; }

    // it'll work if you uncomment this line.
    //operator const boost::asio::const_buffer &() const { return *begin(); }
};

void run_accept(boost::asio::io_service &iosrv, tcp::acceptor &acpt);

int main()
{
    boost::asio::io_service iosrv;

    tcp::acceptor acpt(iosrv, tcp::endpoint(tcp::v4(), 12345));
    run_accept(iosrv, acpt);

    iosrv.run();
}

void run_accept(boost::asio::io_service &iosrv, tcp::acceptor &acpt)
{
    auto pSock = std::make_shared<tcp::socket>(iosrv);
    acpt.async_accept(*pSock,
        [&, pSock](const boost::system::error_code &ec) {
            run_accept(iosrv, acpt);

            std::vector<shared_const_buffer> bufs;
            bufs.push_back(shared_const_buffer({ 'a', 'b', 'c', 'd' }));
            bufs.push_back(shared_const_buffer({ 'e', 'f', 'g', 'h' }));

            boost::asio::async_write(*pSock, bufs,
                [pSock](const boost::system::error_code &ec, size_t size) {
                    pSock->close();
                });
        });
}

但是,我不知道為什么它不起作用。 根據文檔

緩沖區和分散收集I / O

要使用多個緩沖區(即分散收集I / O)進行讀取或寫入,可以將多個緩沖區對象分配到支持MutableBufferSequence(用於讀取)或ConstBufferSequence(用於寫入)概念的容器中:

char d1[128];
std::vector<char> d2(128);
boost::array<char, 128> d3;

boost::array<mutable_buffer, 3> bufs1 = {
  boost::asio::buffer(d1),
  boost::asio::buffer(d2),
  boost::asio::buffer(d3) };
bytes_transferred = sock.receive(bufs1);

std::vector<const_buffer> bufs2;
bufs2.push_back(boost::asio::buffer(d1));
bufs2.push_back(boost::asio::buffer(d2));
bufs2.push_back(boost::asio::buffer(d3));
bytes_transferred = sock.send(bufs2);

另外文檔說這5行足以滿足“ ConstBufferSequence”。

// Implement the ConstBufferSequence requirements.
typedef boost::asio::const_buffer value_type;
typedef const boost::asio::const_buffer* const_iterator;
const boost::asio::const_buffer* begin() const { return &buffer_; }
const boost::asio::const_buffer* end() const { return &buffer_ + 1; }

我錯過了什么? 我正在使用Visual Studio 2013 Update 3和Boost 1.56.0。

微妙的細節是std::vector<shared_const_buffer>被傳遞給write()操作,因此它必須支持ConstBufferSequence概念。 雖然shared_const_buffer滿足ConstBufferSequence的類型要求,但std::vector<shared_const_buffer>無法滿足ConstBufferSequence的類型要求。 ConstBufferSequence的要求之一是,對於X類型, X::value_type是滿足ConvertibleToConstBuffer的類型要求的類型。 基本上,實例const_buffer必須從constructible X::value_type ,可轉讓的,從X::value_type

X::value_type a;
boost::asio::const_buffer u(a);
u = a;

std::vector<shared_const_buffer>的情況下, value_typeshared_const_buffershared_const_buffer既不能用於構造const_buffer也不能分配給const_buffer 因此,導致編譯錯誤。

async_write采用ConstBufferSequence 根據文檔,此概念需要滿足的第一個要求是:

在此處輸入圖片說明

在您的示例中, std::vector<shared_const_buffer>::value_type計算結果為shared_const_buffer ,這意味着它需要對ConvertibleToConstBuffer進行建模。 通過添加轉換,您可以完全滿足。

暫無
暫無

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

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