2014-10-05 189 views
1

我正在寫一種tcp服務器。我正在使用Boost.Asio,與shared_const_bufferBoost.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 \升壓\ ASIO \詳細\ consuming_buffers.hpp(175):錯誤C2679:이항 '=':오른쪽피연산자로 'shared_const_buffer' 형식을사용하는연산자가없거나허용되는변환이없습니다 。

好了,我的Visual Studio是沒有英文版本> 0 <這裏是我的翻譯

d:\ boost_1_56_0 \提升\ ASIO \詳細\ consuming_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_; 
} 

因此,我嘗試將鑄造操作員添加到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(); 
       }); 
     }); 
} 

但是,我不知道爲什麼不起作用。 According to documentation

緩衝器和散射收集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); 

而且documentation說,這是足以與這5線,以滿足「常量BufferSequence」。

// 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並提升1.56.0。

+0

你能告訴我哪一行導致上述錯誤? – 2014-10-05 11:45:17

+0

@LajosArpad錯誤發生在'first_ = * buffers_.begin();'中。編譯器還注意到'boost :: asio :: async_write(* pSock,bufs,...' – ikh 2014-10-05 11:49:41

回答

5

細微的細節是,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實例必須是從X::value_type constructible和分配從X::value_type

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

std::vector<shared_const_buffer>的情況下,是value_typeshared_const_buffer,和shared_const_buffer既不能被用來構造const_buffer也不分配給const_buffer。因此,由此產生的編譯錯誤。

+1

什麼時機好啊,我已經_just_發佈了我的答案,現在不能+1我想:) – sehe 2014-10-05 18:36:04

4

async_write需要ConstBufferSequence。根據該文檔,這個概念需要滿足第一個要求是:

enter image description here

在你的樣品,std::vector<shared_const_buffer>::value_type計算結果爲shared_const_buffer,這意味着它需要建模ConvertibleToConstBuffer。通過添加轉換,您完全可以滿足這一點。

+1

哈,當然是很好的時機。(: – 2014-10-05 18:37:12

+0

@sehe和Tanner:Voltaire說'les beaux esprits se rencontrent'! Literaly translation作爲「偉大的思想相遇」... – 2014-10-05 20:45:23

+1

@ John06我的採訪:「偉大的頭腦閱讀文檔」+「Tanner監視器[標籤:助推器 - asio]」+「sehe監視器[標籤:助推器-...]」這個時機不能用心靈的美好來解釋:) – sehe 2014-10-05 21:37:56