那是行不通的。由于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