Boost.Asio - 自定义缓冲区的多个缓冲区
我正在写一种tcp服务器。我正在使用Boost.Asio,与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 \升压\ 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。
细微的细节是,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_type
shared_const_buffer
,和shared_const_buffer
既不能被用来构造const_buffer
也不分配给const_buffer
。因此,由此产生的编译错误。
什么时机好啊,我已经_just_发布了我的答案,现在不能+1我想:) – sehe 2014-10-05 18:36:04
async_write
需要ConstBufferSequence
。根据该文档,这个概念需要满足第一个要求是:
在你的样品,std::vector<shared_const_buffer>::value_type
计算结果为shared_const_buffer
,这意味着它需要建模ConvertibleToConstBuffer
。通过添加转换,您完全可以满足这一点。
哈,当然是很好的时机。(: – 2014-10-05 18:37:12
@sehe和Tanner:Voltaire说'les beaux esprits se rencontrent'! Literaly translation作为“伟大的思想相遇”... – 2014-10-05 20:45:23
@ John06我的采访:“伟大的头脑阅读文档”+“Tanner监视器[标签:助推器 - asio]”+“sehe监视器[标签:助推器-...]”这个时机不能用心灵的美好来解释:) – sehe 2014-10-05 21:37:56
你能告诉我哪一行导致上述错误? – 2014-10-05 11:45:17
@LajosArpad错误发生在'first_ = * buffers_.begin();'中。编译器还注意到'boost :: asio :: async_write(* pSock,bufs,...' – ikh 2014-10-05 11:49:41