我正在尝试设置一个将序列化数据写入套接字的函数,但是我不知道我应该将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);
答案 0 :(得分:3)
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();