我正在学习提升asio并且有错误。我写了简单的客户端(我可以从它发送数据但是当我读取数据时我甚至无法编译它)我使用协议缓冲区来序列化数据。所以文件#include" test.pb.h"是probuffer类
我的代码客户端:
#include <boost/array.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/thread/thread.hpp>
#include <cstdlib>
#include <iostream>
#include <string>
#include <thread>
#include "test.pb.h"
using boost::asio::ip::tcp;
int main(int argc, char** argv)
{
try
{
// connect to the server:
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
std::string const server_address = "localhost";
std::string const server_port = "10000";
tcp::resolver::query query(server_address, server_port);
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::socket socket(io_service);
boost::asio::connect(socket, endpoint_iterator);
//while ( true)
{
Person p = Person();
p.set_id(22);
p.set_name("Jack vorobey");
// std::cout << p.id();
// std::cout << p.name();
std::string data; // this will hold serialized data
bool ok = p.SerializeToString(&data);
assert(ok);
// std::cout << data.size() << std::endl;
boost::asio::write(socket, boost::asio::buffer(data))
boost::asio::read(socket, boost::asio::buffer(data));;
// break; // Connection closed cleanly by peer.
// std::cout << data.size() << std::endl; // shows a reduction in amount of
remaining data
// boost::asio::read(socket, boost::asio::buffer(data) /*,
}
boost::asio::transfer_exactly(65536) */);
}
catch (std::exception& e)
{
//std::cerr << e.what(luuu) << std::endl;
}
std::cout << "\nClosing";
std::string dummy;
}
我的错误代码我不明白: 错误C2679:二进制&#39; =&#39; :没有找到哪个运算符采用类型&#39; const boost :: asio :: const_buffer&#39;的右手操作数。 (或者没有可接受的转换) 1 GT; c:\ local \ boost_1_55_0 \ boost \ asio \ buffer.hpp(136):可能是&#39; boost :: asio :: mutable_buffer&amp; boost :: asio :: mutable_buffer :: operator =(const boost :: asio :: mutable_buffer&amp;)&#39; 1 GT;试图匹配参数列表&#39;(boost :: asio :: mutable_buffer,const boost :: asio :: const_buffer)&#39;
答案 0 :(得分:1)
这是因为template<typename Elem, typename Traits, typename Allocator> const_buffers_1 buffer(const std::basic_string<Elem, Traits, Allocator> &)
返回const_buffers_1
的实例(这是ConstBufferSequence
概念的模型)。当然,您无法将数据读入常量缓冲区。
不要将数据读入std::string
,因为它不是为此而设(请注意其c_str()
和data()
成员函数返回const char*
)。相反,请分配另一个缓冲区或使用asio::streambuf
。
答案 1 :(得分:1)
您可以使用streambuf,或指定(预分配!)大小:
#include <boost/asio.hpp>
#include <string>
using boost::asio::ip::tcp;
int main()
{
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::socket socket(io_service);
boost::asio::connect(socket, resolver.resolve(tcp::resolver::query("localhost", "10000")));
std::string request("request");
boost::asio::write(socket, boost::asio::buffer(request));
#if 0
std::string response;
response.resize(32);
boost::asio::read(socket, boost::asio::buffer(&response[0], response.size()));
#else
boost::asio::streambuf response;
boost::asio::read(socket, response);
#endif
}