在c ++中通过套接字发送二进制数据

时间:2012-08-29 09:31:59

标签: c++ sockets c++11

在C ++中,我有类似这样的数据结构:

struct Data 
{ 
int N; 
double R; 
char Name[20];
};

这个数据我必须从一个客户端发送到另一个系统上的服务器(我必须发送一个数据结构数组,但我可以一个接一个地发送它)。我想将它作为二进制数据发送,以便我可以在另一端提取数据,将其放在同一个结构类型中。

如果使用相同的编译器编译(客户端和服务器),则sizeof(Data)和结构内的所有位填充都是相同的。但由于服务器是64位运行Linux,客户端甚至可能是32位窗口,因此数据中的数据排序可能会有所不同。

我是对的吗?处理这个问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:5)

假设所有客户端和服务器总是使用相同的编译器为相同的架构构建,操作系统几乎总是一个坏主意。最好编写将结构成员显式打包和解包为具有指定排序的字节流的代码,或者将数据转换为可在另一端解析的非二进制格式(例如JSON或XML)。

答案 1 :(得分:3)

您可以使用Boost.Serialization编组/解组(即将数据从源计算机格式转换为适合传输的格式,并将格式转换为目标计算机使用的格式)和数据{ {3}}处理沟通。

答案 2 :(得分:0)

正确的协议定义可以帮助您解决此问题。有一个固定长度的标题后跟可变长度数据。

像这样的东西

标题 ***

[DataSize] - 2个字节

[MSG ID] - 1个字节

<强>分组 **

[N] - 4个字节

[R] - 8个字节

[Len] - 2个字节

[名称] - Len字节

读取字节并填充结构