Problema ilogico e incomprensible con memcpy
hola gente, tengo un problema, tengo ke hacer un programa ke dentro de otras cosas se comunike con otras maquinas y con otros procesos dentro de la misma maquina a travez de un protocolo.
Para poder hacer esto utilizo la funcion memcpy para comprimir el protocolo y mandarlo dentro de un vector.
el tema es el siguiente cuando recibo el protocolo comprimido por socket de otra maquina lo recibo bien pero cuando lo paso del proceso ke se encarga de comunicaciones externas al proceso que tiene ke trabajar con esos datos, 2 de los campos del protocolo me llegan con otro valor
ejemplo: a mi me llega de la otra maquina un campo ke es un int cuyo valor es igual a 2, entonces yo agarro el mismo vector ke me llego bien y lo reenvio al otro proceso y cuando lo descomprimo (con la misma funcion ke lo descomprimi bien antes) dentro del otro proceso resulta ke ese int en vez de ser 2 ahora es algo como 10842345, esto hace ke el programa funcione mal.
Por favor si alguien sabe por ke puede llegar a pasar este problema por favor responda lo antes posible
gracias a todos!
PD: el lenguaje es ansi c y el sis op es el red hat 8.0
Para poder hacer esto utilizo la funcion memcpy para comprimir el protocolo y mandarlo dentro de un vector.
el tema es el siguiente cuando recibo el protocolo comprimido por socket de otra maquina lo recibo bien pero cuando lo paso del proceso ke se encarga de comunicaciones externas al proceso que tiene ke trabajar con esos datos, 2 de los campos del protocolo me llegan con otro valor
ejemplo: a mi me llega de la otra maquina un campo ke es un int cuyo valor es igual a 2, entonces yo agarro el mismo vector ke me llego bien y lo reenvio al otro proceso y cuando lo descomprimo (con la misma funcion ke lo descomprimi bien antes) dentro del otro proceso resulta ke ese int en vez de ser 2 ahora es algo como 10842345, esto hace ke el programa funcione mal.
Por favor si alguien sabe por ke puede llegar a pasar este problema por favor responda lo antes posible
gracias a todos!
PD: el lenguaje es ansi c y el sis op es el red hat 8.0
No sé si tendrá algo que ver con esto, pero te cuento a ver si hay suerte.
Cuando una estructura tiene campos que no son de tamaño múltiplo de 4, se dejan huecos en ella para que el tamaño total de la estructura sea múltiplo de 4. Por ejemplo
struct A
{
char a;
int b;
}
el sizeof() de esto da 8, entre el char a y el int b se cuelan tres bytes.
Si al enviar por sockets, al hacer el memcpy o cualquier tonteria de esas usas sizeof(), se envian bytes extraños. No puedes evitarlos, pero si debes tenerlo en cuenta.
No puedes, por ejemplo, al enviar hacer
write (estructura, sizeof(estructura))
y leer con
read (estructura.a, sizeof(char))
read (estructura.b, sizeof(int))
en el int se te colaran los tres bytes extraños.
Echa un ojo a ver si los campos que te salen mal estan antes o depues de un campo que no sea multiplo de 4 (o ellos mismos no lo son).
Se bueno.
Cuando una estructura tiene campos que no son de tamaño múltiplo de 4, se dejan huecos en ella para que el tamaño total de la estructura sea múltiplo de 4. Por ejemplo
struct A
{
char a;
int b;
}
el sizeof() de esto da 8, entre el char a y el int b se cuelan tres bytes.
Si al enviar por sockets, al hacer el memcpy o cualquier tonteria de esas usas sizeof(), se envian bytes extraños. No puedes evitarlos, pero si debes tenerlo en cuenta.
No puedes, por ejemplo, al enviar hacer
write (estructura, sizeof(estructura))
y leer con
read (estructura.a, sizeof(char))
read (estructura.b, sizeof(int))
en el int se te colaran los tres bytes extraños.
Echa un ojo a ver si los campos que te salen mal estan antes o depues de un campo que no sea multiplo de 4 (o ellos mismos no lo son).
Se bueno.
