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

Writing serialized data to a socket with boost::asio

本文关键字:数据 套接字 boost asio 使用 序列化      更新时间:2023-10-16

我正试图设置一个函数来将序列化数据写入套接字,但我不知道应该将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);

您可以在文档中简单地看到一些重载

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:中实现的流

  • http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/overview/networking/iostreams.html
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.0rn";
stream << "Host: www.boost.orgrn";
stream << "Accept: */*rn";
stream << "Connection: closernrn";
stream.flush();
std::cout << stream.rdbuf();