Отправка и получение структур через сетевые сокеты (независимо от того, какой тип сокета вы используете для синхронного или асинхронного TCP, датаграмма UDP) логически аналогичны чтению / записи файла. Это означает, что простой дамп памяти не сработает, особенно если ваша структура содержит поля или указатели класса / структуры. Вместо этого обычно используется подход сериализации, например, вы можете сериализовать свою структуру в некоторый двоичный (ASN1, буфер протокола Google и т. Д.) Или текстовый формат (XML, JSON, YAML и т. Д.) - отправьте результат по сети, получите его и удалите сериализацию обратно вструктура.
Вы можете использовать повышение сериализации для предложения сериализации.
Т.е. что-то вроде:
#include <boost/archive/text_oarchive.hpp>
....
struct sample {
char a;
char16_t b;
char c;
std::string d;
char e;
};
namespace boost {
namespace serialization {
template<class Archive>
void serialize(Archive & ar,const sample& value, const unsigned int version)
{
ar & value.a;
ar & value.b;
ar & g.c;
ar & g.d;
ar & g.e;
}
} // namespace serialization
} // namespace boost
...
sample mystruct;
....
std::ostringstream archive_stream;
boost::archive::text_oarchive archive(archive_stream);
archive << mystruct;
...
sock.send_to( boost::asio::buffer(archive_stream.str()), remote, 0, error);
Тогда вы можете десериализовать структурупри получении
#include <boost/archive/text_iarchive.hpp>
....
std::string str;
str.resize(1024);
boost::asio::udp::endpoint sender_endpoint;
std::size_t len = socket.receive_from(
boost::asio::buffer(str), sender_endpoint);
....
std::istringstream archive_stream(str);
sample mystruct;
boost::archive::text_iarchive archive(archive_stream);
archive >> mystruct;