Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Datos binarios sobre sockets

Estas en el tema de Datos binarios sobre sockets en el foro de C/C++ en Foros del Web. Hola, estoy programando un cliente que tiene que enviar mensajes con este formato a un servidor: <4 bytes><1 byte><4 bytes><4 bytes><4 bytes> Donde los campos ...
  #1 (permalink)  
Antiguo 08/04/2009, 16:11
 
Fecha de Ingreso: marzo-2009
Mensajes: 16
Antigüedad: 15 años, 1 mes
Puntos: 0
Datos binarios sobre sockets

Hola, estoy programando un cliente que tiene que enviar mensajes con este formato a un servidor:

<4 bytes><1 byte><4 bytes><4 bytes><4 bytes>

Donde los campos de 4 bytes son enteros. Como no tenía muy claro como construir un mensaje así (hasta ahora la mayor parte de lo que había hecho con sockets había sido enviando strings), lo único que se me ocurrió fue crearme una estructura:

Código:
struct request {
	int lon;
	unsigned char id;
	int index;
	int begin;
	int length;
};
Para probar a ver como funcionaba la cosa me hice este código:

Código:
	struct request peticion;
	peticion.lon=(0xd);
	peticion.id=0x06;
	peticion.index=(0x1);
	peticion.begin=(0x2);
	peticion.length=(0x3);
	write(sock,(void *)&peticion,17);
Y monitoricé con el Wireshark a ver que pasaba. Lo que se envió fue esto:

00000006 2B000001 00000002 00000003

Tiene un ligero parecido con la realidad pero no es lo que debería hacer según entiendo yo. Qué es lo que se me está pasando?
  #2 (permalink)  
Antiguo 09/04/2009, 02:07
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Datos binarios sobre sockets

El 6 aparece solo - en un DWORD, 4 bytes - asi que lo mas probable es que la estructura para el compilador no ocupe 17 bytes sino 20, siempre usa sizeof para obtener el tamaño de una estructura. Esto lo podes cambiar configurando el empaquetamiento de campos con por ejemplo #pragma pack o attribute packed.

PD. El 2B no se de donde salio ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 09/04/2009, 03:51
 
Fecha de Ingreso: marzo-2009
Mensajes: 16
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Datos binarios sobre sockets

Perfecto, la cosa queda así:

Cita:
struct request {
int lon;
unsigned char id;
int index;
int begin;
int length;
} __attribute__((__packed__));
Además en mi caso tengo que cambiar la ordenación de los enteros para que se envíen correctamente:

Cita:
struct request peticion;
peticion.lon=htonl(0xd);
peticion.id=0x06;
peticion.index=htonl(0x1);
peticion.begin=htonl(0x2);
peticion.length=htonl(0x3);
Como la seda:

0000000D 06 00000001 00000002 00000003

Muchísimas gracias!
  #4 (permalink)  
Antiguo 09/04/2009, 03:56
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Datos binarios sobre sockets

De nadas
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:04.