使用 malloc 在 C 中进行序列化
Serialization in C with malloc
在整个网络上搜索在 C 中序列化数据的方法,以便我可以通过 TCP/IP 套接字发送结构,但我找不到任何简单的方法。但我认为通过这种方式,您可以固定数据包中位的位置,从而将其序列化 "de facto".
packet *datapkt = NULL;
datapkt = (packet*)malloc(PKT_SIZE); // Allocation of memory with this size
datapkt->field = data;
......
send(datapkt);
free(datapkt);
谁能告诉我这是不是个好主意?到目前为止它在我的项目中工作。
提前致谢!
您的方法存在严重缺陷。
您对结构的内存布局没有影响。编译器可能会在 struc 成员之间添加填充字节。如果连接两端的编译器和 CPU 不同,则使用简单结构的方法将失败。更不用说不同硬件上的不同字节序了。
因此这不是一个好主意。
在相同的编译器和编译标志下,使用结构在本地内部 thread/process 通信上进行序列化是可以的。
但是对于网络通信来说不是个好主意。网络上的客户端可能有不同的 CPU arch 或操作系统,并且不能保证结构成员的内存分配在不同的机器上是恒定的,例如 sizeof(int) 在 X86 和 [=14 中可能不同=] 或其他 architecture/compiler。内存布局由编译器定义,在不同的机器甚至不同的操作系统上可能会有所不同,填充和字节序也会进入并改变内存布局。
执行此操作时,您必须考虑两件事:
1. Endianness
2. Compiler padding
第一点将使数据根据系统的字节顺序采用不同的形式。对于大于一个字节的类型,这是一个问题。
对于第二点,您需要确保编译器没有在结构的成员之间添加任何字节。这可以通过编译器编译指示来完成。
在整个网络上搜索在 C 中序列化数据的方法,以便我可以通过 TCP/IP 套接字发送结构,但我找不到任何简单的方法。但我认为通过这种方式,您可以固定数据包中位的位置,从而将其序列化 "de facto".
packet *datapkt = NULL;
datapkt = (packet*)malloc(PKT_SIZE); // Allocation of memory with this size
datapkt->field = data;
......
send(datapkt);
free(datapkt);
谁能告诉我这是不是个好主意?到目前为止它在我的项目中工作。
提前致谢!
您的方法存在严重缺陷。 您对结构的内存布局没有影响。编译器可能会在 struc 成员之间添加填充字节。如果连接两端的编译器和 CPU 不同,则使用简单结构的方法将失败。更不用说不同硬件上的不同字节序了。
因此这不是一个好主意。
在相同的编译器和编译标志下,使用结构在本地内部 thread/process 通信上进行序列化是可以的。 但是对于网络通信来说不是个好主意。网络上的客户端可能有不同的 CPU arch 或操作系统,并且不能保证结构成员的内存分配在不同的机器上是恒定的,例如 sizeof(int) 在 X86 和 [=14 中可能不同=] 或其他 architecture/compiler。内存布局由编译器定义,在不同的机器甚至不同的操作系统上可能会有所不同,填充和字节序也会进入并改变内存布局。
执行此操作时,您必须考虑两件事:
1. Endianness
2. Compiler padding
第一点将使数据根据系统的字节顺序采用不同的形式。对于大于一个字节的类型,这是一个问题。
对于第二点,您需要确保编译器没有在结构的成员之间添加任何字节。这可以通过编译器编译指示来完成。