通过套接字发送的自定义数据包



关于如何编码数据以通过套接字发送的任何建议?

struct {
int id,
std::string name,
std::string address
}

我目前有这个:

std::string s;
client_type client = { INVALID_SOCKET, -1, "" };
send(client.socket, s.c_str(), strlen(s.c_str()), 0);

我可以发送一个字符串。将上述信息发送到服务器的最佳方法是什么?

使用序列化库,并通过该库将数据转换为已知数据格式之一。例如,我使用 cereal(查看链接以获取示例(库将我的数据序列化为 json 格式。这是C++序列化库的一个很好的列表。选择最适合您的格式,然后选择一个库来序列化和反序列化数据。

下面是一个针对您的案例使用cereal的 xml 序列化示例(编辑:立即编译(:

#include <cereal/archives/xml.hpp>
#include <sstream>
#include <iostream>

struct SomeData{
int id;
std::string name;
std::string address;
template <class Archive>
void serialize( Archive & ar )
{
ar( id, name, address );
}
};
int main()
{
std::stringstream ss;
// this block is used to make sure the destrcutor of archive is called
// which flushes the output into string stream.
{
cereal::XMLOutputArchive archive( ss );
SomeData myData{4, "name", "address"};
archive( myData );
}
std::string s = ss.str();
// test output 
std::cout << s << std::endl;
// send data
send(client.socket, s.c_str(), s.length(), 0);
return 0;
}

这是输出:

<?xml version="1.0" encoding="utf-8"?>
<cereal>
<value0>
<value0>4</value0>
<value1>name</value1>
<value2>address</value2>
</value0>
</cereal>    

最新更新