使用boost :: asio将序列化数据写入套接字

时间:2015-04-04 11:59:03

标签: c++ sockets serialization boost

我正在尝试设置一个将序列化数据写入套接字的函数,但是我不知道我应该将boost :: buffer包装在哪个对象中。官方boost文档中的一个示例使用std :: ostringstream并从str()成员(类型为std :: string)构造缓冲区,但我无法做同样的事情。

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);

1 个答案:

答案 0 :(得分: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,你可以使用Boost Asio中实现的流:

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();