Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost::asio通过UDP发送结构_C++_Boost_Asio - Fatal编程技术网

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

C++ 使用boost::asio通过UDP发送结构,c++,boost,asio,C++,Boost,Asio,我需要通过UDP一次发送不同数据类型的结构。我尝试过使用boost库,但无法同时发送所有结构元素。以下是我需要发送的结构片段: struct sample { char a; char16_t b; char c; std::string d; char e; }; sample mystruct; 创建一个连接每个元素的字符串对我来说不起作用,因为我发送的十六进制值不应转换为字符串。这是我通过套接字

我需要通过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);
这不起作用,因为正在发送其他数据。我只想发送结构的元素,它们之间没有分离或任何类型的数据


提前谢谢。

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


您必须使用类似于Boost序列化库、Protobuffers或类似库的东西;或者自己执行类似的任务。

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


您必须使用类似于Boost序列化库、Protobuffers或类似库的东西;或者自己执行类似的任务。

通过网络套接字发送和接收结构(无论您使用的是什么类型的套接字,同步或异步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);
#包括
....
结构样本{
字符a;
char16_t b;
字符c;
std::字符串d;
字符e;
};
名称空间提升{
命名空间序列化{
模板
无效序列化(存档和ar、常量样本和值、常量无符号整数版本)
{
应收账款和价值a;
应收账款&价值b;
ar&g.c;
ar&g.d;
ar&g.e;
}
}//命名空间序列化
}//名称空间提升
...
样本结构;
....
std::ostringstream归档文件\u流;
boost::archive::text\u oarchive归档(归档流);
档案>mystruct;

通过网络套接字发送和接收结构(无论您使用的是同步还是异步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);
#包括
....
结构样本{
字符a;
char16_t b;
字符c;
std::字符串d;
字符e;
};
名称空间提升{
命名空间序列化{
模板
无效序列化(存档和ar、常量样本和值、常量无符号整数版本)
{
应收账款和价值a;
应收账款&价值b;
ar&g.c;
ar&g.d;
ar&g.e;
}
}//命名空间序列化
}//名称空间提升
...
样本结构;
....
std::ostringstream归档文件\u流;
boost::archive::text\u oarchive归档(归档流);
档案>mystruct;

想想
std::string
到底是什么。。。由于它包装的字符串可以是动态长度的,您认为这是如何实现的?也许是使用一个指针,该指针仅在您当前进程的本地(因此,同一系统上的另一个进程不可用,更不用说在远程系统上了)?通常,您只能“按原样”发送结构,并且您的结构(由于使用了
std::string
)不是POD。请思考一下
std::string
到底是什么。。。由于它包装的字符串可以是动态长度的,您认为这是如何实现的?也许是使用一个指针,该指针仅在您当前进程的本地(因此,同一系统上的另一个进程不可用,更不用说在远程系统上了)?通常,您只能“按原样”发送结构,并且您的结构(由于使用了
std::string
)不是POD。