¿Cuál es la mejor manera de enviar y recibir estructuras en la red utilizando sockets en C?

El problema con el envío de estructuras a través de sockets (es decir, TCP) es que usted se limita completamente a la estructura tal como existe hoy. No hay extensibilidad. Además, también puede ser muy derrochador si el valor dentro de la estructura es significativamente menor que el número real de bits que deben transmitirse.

Un enfoque para solucionar esto es codificar todo en tuplas de tipo, longitud y valor. Cada bit de datos atómicos obtendría un descriptor, cada uno de los cuales contendría el tipo de esos datos, su longitud y luego el valor en sí. Esto se ha hecho varias veces en los protocolos de enrutamiento y ha demostrado ser muy robusto.

Otro enfoque es hacer uso de los buffers de protocolo de Google. Este es esencialmente el mismo concepto, con el beneficio adicional de que sus rutinas de cálculo de datos pueden automatizarse.

Un tercer enfoque es codificar todo en JSON primero.

Además de la respuesta de Tony, me gustaría señalar que no siempre es la mejor idea simplemente

tome un puntero de byte (char) y apúntelo a la estructura

Es posible que su cliente y servidor se encuentren en máquinas diferentes con arquitecturas y endianness completamente diferentes. Además, puede haber un problema de alineación de la Estructura de datos con dicha conversión. Alineación de estructura de datos

En el lado de los remitentes, puede convertir cada miembro de la estructura individualmente usando memcpy en una secuencia de bytes en lugar de señalar una secuencia de bytes en la estructura.