gpt4 book ai didi

c++ - 使用 boost::asio 通过 UDP 发送结构

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:48 24 4
gpt4 key购买 nike

我需要通过 UDP 一次发送不同数据类型的结构。我试过使用 boost 库,但我无法一次发送所有结构元素。这是我需要发送的结构的片段:

    struct sample {
char a;
char16_t b;
char c;
std::string d;
char e;
};
sample mystruct;

创建一个连接每个元素的字符串对我来说不起作用,因为我发送的是不应转换为字符串的十六进制值。这是我用于通过套接字发送信息的方法:

sock.send_to(boost::asio::buffer(&mystruct, sizeof(mystruct)), remote, 0, error);

这不起作用,因为正在发送额外的数据。我只想发送结构的元素,它们之间没有分隔或任何类型的数据。

提前致谢。

最佳答案

通过网络套接字发送和接收结构(无论您使用的是什么类型的套接字,同步或异步 TCP,数据报 UDP)在逻辑上类似于文件读/写。这意味着-简单地转储内存方法是行不通的,尤其是当您的结构包含类/结构字段或指针时。通常使用序列化方法,例如您可以将您的结构序列化为某种二进制格式(ASN1、Google Protocol Buffers 等)或文本格式(XML、JSON、YAML 等)- 通过网络发送结果、接收结果并反序列化回结构。

您可以使用 boost serialization连载建议。

即像这样的东西:

#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 & value.c;
ar & value.d;
ar & value.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;

关于c++ - 使用 boost::asio 通过 UDP 发送结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58692569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com