Problemas big y little endian

Temas relacionados con la programación de aplicaciones que funcionan sobre un servidor.
Responder
Mensaje
Autor
polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

Problemas big y little endian

#1 Mensaje por polly » 15/01/2011 12:16 pm

Buenas, tengo un programa servidor en C de fecha y hora corriendo en una máquina Big endian (sparc) y un cliente del servidor corriendo en un máquina Little endian (intel).

Bueno el caso es que ambos se comunican con una conexión TCP, el cliente simplemente solicita la fecha y hora al servidor y este la devuelve; pero el cliente sólo recibe valores "basura" (se distingue un poco el mes y los dos puntos que separan la hora).
Probé a ejecutar el cliente en la misma máquina que el servidor y todo funcionó correctamente.

Asi que supongo que el endianess tendrá algo que ver y no se cómo pasar la estructura 'struct tm' de big endian a little endian.

S2

Avatar de Usuario
Sorancio
Mensajes: 1157
Registrado: 29/05/2009 12:42 pm
Ubicación: España
Contactar:

#2 Mensaje por Sorancio » 15/01/2011 12:28 pm

Quizá ésto te sirva. ¡Mucha suerte!

Avatar de Usuario
cheroky
Mensajes: 2571
Registrado: 22/09/2005 11:00 pm
Ubicación: Valladolid (España)

#3 Mensaje por cheroky » 15/01/2011 3:01 pm

Hola.

Son dos problemas que resultan de manejar streams binarios entre arquitecturas diferentes; uno es el endianness y el segundo el alineamiento y como consecuencia el padding (relleno).

El primero se resuelve como ya te han comentado con funciones que cambian el "byte order", el segundo con extensiones del compilador, pero el problema de eliminar el padding deriva en que los agregados son irreconocibles por el API y deben ser reesamblados.

Entre arquitecturas diferentes pero con punteros del mismo tamaño, por ejemplo SPARC 32 e IA32 quizás baste solo lidiar con el endianness.

Soluciones; hay varias, pero me pregunto sino seria más conveniente que el servidor enviara los datos de forma "analógica" mediante una simple cadena o un array con númeritos.


∙∃0ƒ∙
Imagen

polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

#4 Mensaje por polly » 15/01/2011 4:05 pm

Gracias Sorancio, esa página ya la había visitado jeje. Pero esas funciones sólo sirven para convertir enteros y no estructuras (aunque ahora que me doy cuenta, la estructura 'struct tm' sólo está formada por enteros y podría convertir cada uno por separado ... pero mi idea era poder usar la función asctime() para que lo muestre como una cadena directamente).

Gracias cheroky. Si, mi primera idea fue que el servidor enviara una cadena de caracteres con la fecha y hora, pero me exigen que envíe una estructura struct tm.
Como ya comenté mi idea era imprimir la fecha y hora con la función asctime(), pero me da que tendré que convertir cada campo por separado y luego imprimirlos por separado.

S2

Avatar de Usuario
rir3760
Mensajes: 7553
Registrado: 01/10/2004 11:00 pm
Ubicación: Mexico

#5 Mensaje por rir3760 » 16/01/2011 7:24 am

La unica solucion que garantiza la portabilidad de los datos es la indicada por cheroky. Si le explicas eso a tu profesor yo supongo no tendra inconveniente en permitir cambiar esa parte del programa.

Si no es posible tendrias que enviar primero la informacion sobre la estructura utilizando la macro "offsetof" para obtener la direccion base junto con su numero de bytes mediante el operador "sizeof", tambien se debe indicar (y ajustar) el orden de los bytes.

Ante ello sigo pensando que es mejor una buena dosis de diplomacia con el instructor.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

#6 Mensaje por polly » 16/01/2011 3:36 pm

Al final he optado por hacerlo "a pelo". A cada miembro de la estructura 'struct tm' le aplico ntohl() definiendo un array de cadenas para los dias y meses.

La opción que mencionas rir3760 puede valer para mi servidor, pero tengo otro apartado de la práctica en la que el servidor ya está creado y ejecutándose en la máquina devolviendo estructuras del tipo 'struct tm', y claro, eso no lo puedo cambiar.

Saludos.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados