编辑:我在下面收回我的答案,我提出的确实比 stringstream 解决方案具有时间和空间优势,但 asio::stream API 缺少一些长期需要的重要功能(例如定时中断)。
我原来的答案:
使用来自 boost::asio 的流,与将其写入 std::stringstreams 然后一次性发送相比,它具有时间和空间优势。方法如下:
客户端代码:
boost::asio::ip::tcp::iostream stream("localhost", "3000");
if (!stream)
throw std::runtime_error("can't connect");
服务器代码:
boost::asio::io_service ios;
boost::asio::ip::tcp::endpoint endpoint
= boost::asio::ip::tcp::endpoint(ip::tcp::v4(), 3000);
boost::asio::ip::tcp::acceptor acceptor(ios, endpoint);
boost::asio::ip::tcp::iostream stream;
// Your program stops here until client connects.
acceptor.accept(*stream.rdbuf());
然后,在您连接到客户端或服务器流之后,只需执行以下操作:
MyDataType obj;
// Send the object.
boost::archive::text_oarchive archive(stream);
archive << obj;
// Or receive it.
boost::archive::text_iarchive archive(stream);
archive >> obj;
正如 Tymek 在他的回答中所写,您当然需要将“序列化”功能添加到您的 MyDataType 中。