2014-06-20 21 views
0

我正在学习boost asio并出错。我写了简单的客户端(我可以从它发送数据,但是当我读取数据时,我甚至不能编译它)我使用协议缓冲区来序列化数据。所以文件的#include “test.pb.h” 是probuffer类在客户端使用升级asio读取数据

我的代码客户端:

#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:二进制 '=':没有操作员发现它需要类型'const boost :: asio :: const_buffer'的右手操作数(或者没有可接受的转换)1> c:\ local \ boost_1_55_0 \ boost \ asio \ buffer.hpp(136):可能是'boost :: asio :: mutable_buffer & boost :: asio :: mutable_buffer :: operator =(const boost :: asio :: mutable_buffer &)' 1>尝试匹配参数列表'(boost :: asio ::穆塔ble_buffer,const boost :: asio :: const_buffer)'

+0

你为什么不张贴样品用略少的语法错误?您的编译器将永远不会编译您在问题中显示的代码。 – sehe

回答

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

可以使用流缓冲,或指定(预分配!)尺寸:

#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 
} 
相关问题