Al buscar en toda la web formas de serializar datos en C para poder enviar una estructura a través de un socket TCP / IP, no pude encontrar nada simple. Pero creo que de esta manera, puede arreglar las posiciones de los bits en un paquete y así serializarlo "de facto".

packet *datapkt = NULL;
datapkt = (packet*)malloc(PKT_SIZE); // Allocation of memory with this size
datapkt->field = data;
......
send(datapkt);
free(datapkt);

¿Alguien puede decirme si es una buena idea? Hasta aquí está funcionando en mi proyecto.

¡Gracias de antemano!

1
Sanjo 28 dic. 2016 a las 13:31

3 respuestas

La mejor respuesta

Al hacer esto, debes considerar dos cosas:

1. Endianness
2. Compiler padding

El primer punto hará que los datos tomen una forma diferente dependiendo de la resistencia de su sistema. Este es un problema para tipos más grandes que un byte.

Para el segundo punto, deberá asegurarse de que el compilador no agregue bytes entre los miembros de su estructura. Esto se puede hacer con pragmas del compilador.

0
staringlizard 28 dic. 2016 a las 10:46

Hay un defecto grave en su enfoque. No tiene influencia en el diseño de memoria de su estructura. El compilador podría agregar bytes de relleno entre los miembros de struc. Si tiene diferentes compiladores y CPU en ambos extremos de la conexión, su enfoque utilizando una estructura simple fallará. Sin mencionar la endianess diferente en hardware diferente.

Por lo tanto, no es una buena idea.

0
Gerhardh 28 dic. 2016 a las 10:38

El uso de estructuras para la serialización a través de comunicaciones locales entre subprocesos / procesos está bien bajo el mismo compilador y compilando indicadores. Pero no es una buena idea para las comunicaciones de red. los clientes en la red pueden tener un arco de CPU o sistema operativo diferente y no hay ninguna garantía de que la asignación de memoria para los miembros de la estructura sea constante en diferentes máquinas, por ejemplo, sizeof (int) puede diferir en X86 y X86_64 u otra arquitectura / compilador. el compilador define el diseño de la memoria y puede variar en diferentes máquinas, incluso en diferentes sistemas operativos, también están llegando almohadillas y endiannes y también cambia el diseño de la memoria.

0
e.jahandar 28 dic. 2016 a las 10:43