Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Asio-具有自定义缓冲区的多个缓冲区_C++_Boost_Boost Asio - Fatal编程技术网

C++ Asio-具有自定义缓冲区的多个缓冲区

C++ Asio-具有自定义缓冲区的多个缓冲区,c++,boost,boost-asio,C++,Boost,Boost Asio,我正在写一种tcp服务器。我用的是Boost.Asio和 现在我必须写多个缓冲区。所以我这样写: std::vector<shared_const_buffer> bufs; bufs.push_back(buf1); bufs.push_back(buf2); ... boost::asio::async_write(*pSock, bufs, [] { ... }); 所以我尝试将强制转换操作符添加到共享常量缓冲区中,它神奇地工作了 这是我的 我错过了什么?我正在使用Visua

我正在写一种tcp服务器。我用的是Boost.Asio和

现在我必须写多个缓冲区。所以我这样写:

std::vector<shared_const_buffer> bufs;
bufs.push_back(buf1);
bufs.push_back(buf2);
...
boost::asio::async_write(*pSock, bufs, [] { ... });
所以我尝试将强制转换操作符添加到共享常量缓冲区中,它神奇地工作了

这是我的

我错过了什么?我正在使用Visual Studio 2013更新3和boost 1.56.0。

async\u写入需要一段时间。根据文件,该概念需要满足的第一个要求是:

在您的示例中,std::vector::value_类型计算为shared_const_buffer,这意味着它需要建模。通过添加转换,您就完全满足了这一点。

异步写入需要一段时间。根据文件,该概念需要满足的第一个要求是:

在您的示例中,std::vector::value_类型计算为shared_const_buffer,这意味着它需要建模。通过添加转换,您完全满足了这一点。

微妙的细节是std::vector正在被传递到写操作,因此它必须支持这个概念。虽然shared_const_buffer满足ConstBufferSequence的类型要求,但std::vector无法满足ConstBufferSequence的类型要求。ConstBufferSequence的一个要求是,对于X类型,X::value_type是一个满足类型要求的类型。基本上,的实例必须可以从X::value_类型构造,并且可以从X::value_类型赋值:

X::值_类型a; boost::asio::const_buffer ua; u=a; 在std::vector的情况下,值类型为shared_const_buffer,shared_const_buffer既不能用于构造const_buffer,也不能分配给const_buffer。因此,产生了编译错误。

微妙的细节是std::vector正在被传递到写操作,因此它必须支持这个概念。虽然shared_const_buffer满足ConstBufferSequence的类型要求,但std::vector无法满足ConstBufferSequence的类型要求。ConstBufferSequence的一个要求是,对于X类型,X::value_type是一个满足类型要求的类型。基本上,的实例必须可以从X::value_类型构造,并且可以从X::value_类型赋值:

X::值_类型a; boost::asio::const_buffer ua; u=a;
在std::vector的情况下,值类型为shared_const_buffer,shared_const_buffer既不能用于构造const_buffer,也不能分配给const_buffer。因此,产生了编译错误。

您能告诉我哪一行导致了上述错误吗?@LajosArpad error发生在first.=*buffers..begin;中;。编译器还注意到boost::asio::async\u write*pSock,bufs,…。您能告诉我哪一行导致了上述错误吗?@LajosArpad error发生在first\u=*buffers\uu.begin;中;。编译器还注意到boost::asio::async_write*pSock、bufs等等。多么好的计时。我刚刚公布了我的答案。我想现在不能+1:多好的时机啊。我刚刚公布了我的答案。现在不能+1我想:哈,当然是个好时机@塞赫和坦纳:伏尔泰说过“美丽的esprits se RENCENT”!文学翻译为伟大的思想相遇…@John06我的目标:伟大的思想阅读文档+Tanner监视器+sehe监视器。时间不能用心灵之美来解释:哈,当然是伟大的时间@塞赫和坦纳:伏尔泰说过“美丽的esprits se RENCENT”!文学翻译为伟大的思想相遇…@John06我的目标:伟大的思想阅读文档+Tanner监视器+sehe监视器。时间的选择不能用心灵的美来解释:
if (!at_end_)
{
  first_ = *buffers_.begin(); // <-- here's error point
  ++begin_remainder_;
}
#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();
                });
        });
}
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);
// 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; }