mas - Transmitir una aplicación de arquitectura little-endian a big-endian
little endian and big endian pdf (2)
¿Te aseguraste de usar ntoh / ntos cuando también recibes datos?
Por cierto, debería simplemente usar la estructura para enviar datos; volver a montarlo en la matriz de caracteres no hace más que tomar el tiempo de la CPU y posiblemente soportar errores.
Tengo un servidor TCP desarrollado en arquitectura x86 usando C en Linux usando la API berkley socker. El servidor funciona bien sin ningún problema. Pero ahora, por alguna razón, tengo que ejecutar el servidor en la arquitectura MIPS que tiene una arquitectura big-endian
.
El servidor y los clientes se comunican a través de un conjunto de protocolos predefinidos. Daré un ejemplo de cómo un servidor envía un mensaje simple a los clientes:
struct echo_req req;
req.header.version = OFP_VERSION;
req.header.type = OFPT_ECHO_REQUEST;
req.header.length = htons (sizeof req);
req.header.xid = htonl(y);
req.data = htonl (456);
char data[sizeof (req)];
data[0] = req.header.version;
data[1] = req.header.type;
memcpy (data + 2, &req.header.length, 2);
memcpy (data + 4, &req.header.xid, 4);
memcpy (data + 8, &req.data, 4);
if ((send (sock_fd, &data, sizeof (data), 0) == -1))
{
printf ("Error in sending echo request message/n");
exit (-1);
}
printf("Echo Request sent!/n");
Como puede ver, utilizo htonl
y htons
para cualquier tipo más largo que un byte para convertirlo en orden de bytes de red. Después de inventar un paquete, serializo y empaqueté los datos en una matriz de caracteres y finalmente los envié a redescubrimiento.
Ahora, antes de ejecutar mi servidor en la arquitectura Big-endian, quería aclarar algunas cosas. En mi opinión, al memcpy
los datos y empacarlos, si los envío a través de la red no deberían causar ningún problema en la arquitectura big-endian ya que memcpy realizará una copia byte por byte de los datos en la matriz y, por lo tanto, no debería haber ningún problema con el orden de bytes cuando se ejecuta en Big-endian. Sin embargo, quería obtener la opinión de su gente, que insisto sabe mucho más que yo, ya que todavía soy un principiante en la programación de redes :). Por favor, guíame en esto si estoy en el camino correcto o no. Toda ayuda muy apreciada.
Gracias
Sí, memcpy
solo copia bytes en orden de una fuente a un destino.
Sin ver el resto de su código, es imposible decir que ha usado hton (l | s) en todos los lugares que debería. También es posible que haya hecho algo así como copiar un byte de número en coma flotante para byte, que no necesariamente funciona, independientemente de los problemas de endianness.
Sin embargo, no veo ningún problema obvio en el código que has publicado anteriormente.