РЕДАКТИРОВАТЬ: я забираю свой ответ ниже, то, что я предложил, имеет преимущество во времени и пространстве по сравнению с решением для работы с потоком строк, но API asio :: stream не хватает некоторых важных функций, которые потребуются в долгосрочной перспективе (например, прерывание по времени). ).
Мой оригинальный ответ:
Используйте потоки из 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;
Вам, конечно, нужно добавить функцию 'serialize' в ваш MyDataType, как написал Тимек в своем ответе.