2014-06-20 73 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 
} 
相關問題