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

我需要通过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,error);

这不起作用,因为正在发送其他数据。我只想发送该结构的元素,而无需分离或它们之间的任何类型的数据。

谢谢。

Scorpio_Huang 回答:使用boost :: asio通过UDP发送结构

那是行不通的。由于ASIO不执行任何序列化,因此只能通过连接发送原始数据。 std::string不是普通类型,还包含在连接上发送没有意义的成员(如指针)。此外,结构可能无法在不同种类的计算机之间移植。

您将不得不使用Boost序列化库,Protobuffers或类似的库;或自己执行类似的职责。

,

通过网络套接字发送和接收结构(无论使用哪种类型的套接字,都使用同步或异步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 & 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,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;
本文链接:https://www.f2er.com/3167116.html

大家都在问