Básicamente está diseñando un protocolo de red binario, por lo que es posible que desee utilizar una biblioteca existente (como los búferes de protocolo de Google). Si aún desea diseñar su propia, se puede lograr la portabilidad razonable de escritura estructuras primas al hacer esto:
- empacar sus estructuras (de GCC
__attribute__((packed))
, MSVC de #pragma pack
). Esto es específico del compilador.
- Asegúrate de que tu número entero sea correcto (
htons
, htonl
). Esto es específico de la arquitectura.
- No utilice punteros para cadenas (use memorias intermedias de caracteres).
- Use tamaños enteros exactos C99 (
uint32_t
etc.).
- Asegúrese de que el código solo compila donde
CHAR_BIT
es 8, que es el más común, o maneja la transformación de cadenas de caracteres a una secuencia de octetos de 8 bits. Hay algunos entornos donde CHAR_BIT
! = 8, pero tienden a ser hardware de propósito especial.
Con esto usted puede estar razonablemente seguro de que obtendrá el mismo resultado en el otro extremo siempre que use la misma definición de estructura. Sin embargo, no estoy seguro acerca de la representación de los números de punto flotante, pero generalmente evito enviarlos.
Otro aspecto no relacionado con la portabilidad es la compatibilidad con versiones anteriores al introducir la longitud como primer campo y/o usar la etiqueta de versión.
Es compatible con C++, no con C, pero aquí hay un enlace a la página de búferes de protocolo de Google: http://code.google.com/apis/protocolbuffers/ –
Gracias - habiendo investigado un poco más en base a esta respuesta, también encontré los siguientes artículos sobre el código C portátil que pueden ser útiles para cualquier otra persona que encuentre esta pregunta: http://serghei.net/docs/programming/autobook-1.1/writing20portable20c.html y http://www.chris-lott.org /resources/cstyle/portableC.html – Justin
@Alex Reynolds realmente? Este parece bastante activo. http://code.google.com/p/protobuf-c/ –