2015-04-04 86 views
1

我想設置一個函數來將序列化的數據寫入套接字,但是我不知道什麼對象我應該包裝boost :: buffer周圍。官方boost文檔中的示例使用std :: ostringstream並從str()成員(類型std :: string)構造緩衝區,但我無法做到這一點。編寫串行化數據到一個套接字與boost :: asio

sendData(const std::vector<_t> values){ 
    std::stringstream ss; 
    boost::archive::text_oarchive oa(ss); 
    oa << values; 

    int n = client_sock.write_some(boost::asio::buffer(&oa,sizeof(oa),ec); 

} 

當我嘗試使用ss.str(),而不是OA構建緩衝,我得到:

error: no matching function for call to buffer(std::basic_ostringstream<char>::__string_type*&, long unsigned int&, boost::system::error_code&)’` 
int n = client_sock.write_some(boost::asio::buffer(&ss.str(),sizeof(ss.str()),ec); 
+0

改爲使用底層'stringstream'中的字符串。 – 2015-04-04 12:01:44

+0

@JoachimPileborg不起作用。我已經更新了我的問題。 – joaocandre 2015-04-04 12:06:17

回答

3

你可以簡單地看到the documentation

std::string s = ss.str(); 
client_sock.write_some(boost::asio::buffer(s),ec); 
一些重載

或者,只需使用'

boost:::asio::streambuf sb; 
std::ostream os(&sb); 

// serialize into `os` 
boost::asio::write(client_sock, sb); 

注意因爲緩衝區需要留下您不能使用異步調用的局部變量周圍

這就是說,因爲你反正使用同步IO,您可以使用升壓短耳實現的流:

ip::tcp::iostream stream; 
stream.expires_from_now(boost::posix_time::seconds(60)); 
stream.connect("www.boost.org", "http"); 
stream << "GET /LICENSE_1_0.txt HTTP/1.0\r\n"; 
stream << "Host: www.boost.org\r\n"; 
stream << "Accept: */*\r\n"; 
stream << "Connection: close\r\n\r\n"; 
stream.flush(); 
std::cout << stream.rdbuf(); 
+0

因此,調用'boost :: asio :: write'會自動序列化數據?因爲我的問題是如何將'boost :: text_oarchive'中序列化的緩衝區封裝起來 – joaocandre 2015-04-05 14:03:40

相關問題