Closed agusmoles closed 6 years ago
Buenas!
Si es un código de operación solamente, al debuggear, que valores hexa tiene almacenada la variable? Cual es el numero "random" que les dá el tamaño? :slightly_smiling_face:
Mala mía por el cierre, quería consultar aparte de lo que dice Tom, es por casualidad están usando una pc de uds con Ubuntu 64 bits? ya que si es asi posiblemente si el header es un puntero las cosas cambien de longitudes :)
Lo que envia el ESI:
Lo que recibe el Coordinador (en maq. virtual):
No entendi lo de los valores hexa, antes de enviar, despues o cuando?
Y si, Ubuntu es de 64bits, pense que si era eso se solucionaria con lo de int32_t, pero no.
Saludos!
Lo que te pidio @tferraro es que nos pases una captura del debug de eclipse entiendo.
Respecto a lo de ubuntu 64 bits, si, se soluciona el tamaño del tipo de dato con int32_t si y solo si estas definiendolo como:
int32_t clave
si haces
int32_t* clave
Estas complicado porque ahi es un puntero y si te cambia el tamaño.
Por otro lado, como estas mandando los datos? podes pegar el armado del buffer del send y como haces el recv?
Saludos.-
Te dejo el struct del header y como envio los datos:
typedef struct header{
int32_t codigoOperacion;
int32_t tamanioClave;
}header;
case GET:
tamanioClave = strlen(parsed.argumentos.GET.clave) + 1;
header = crearHeader(0, tamanioClave);
enviarHeader(socketCoordinador, header);
enviarClave(socketCoordinador, parsed.argumentos.GET.clave);
void enviarHeader(int socket, header* header) {
if (send(socket, header, sizeof(header), 0) < 0) {
exitError(socket, ANSI_COLOR_BOLDRED"No se pudo enviar el header"ANSI_COLOR_RESET);
}
log_info(logger, ANSI_COLOR_BOLDGREEN"Se envio el header"ANSI_COLOR_RESET);
}
Lo recibo en un switch y despues hago otras cosas que no vienen al caso creo:
header* buffer_header = malloc(sizeof(header));
switch(recv(socketCliente->fd, buffer_header, sizeof(header), MSG_WAITALL)){
Con respecto lo que me pidio @tferraro no entiendo que tengo que hacer. Disculpen la ignorancia
Saludos!
Fijate que estas haciendo el sizeof(header) cuando header es un header, osea que en Ubuntu 64 Bits te funciona bien por pura suerte porque el sizeof de un header es de 8 bytes (64 bits) y en la vm de lubuntu server es de 32bits (osea 4bytes)
Aca es donde nos ponemos densos y decimos: sean prolijos codeando, por ejemplo:
typedef struct header{
int32_t codigoOperacion;
int32_t tamanioClave;
}header;
//Podria y quedaria mejor si fuera:
typedef struct header{
int32_t codigoOperacion;
int32_t tamanioClave;
}header_t;
Claro, somos unos capos...
Gracias por contestar tan rapido!
Cualquier duda vuelvo a abrir. Saludos!
Buenas, tenemos un problema enviando el header de los mensajes entre ESI-Coordinador. En la maquina virtual imprimimos el Codigo de Operacion y el tamaño de la clave por pantalla y el primero esta bien, pero el tamaño tira un numero 'random' pero fijo siempre que ejecutamos.
Verificamos que el send y recv manden/reciban todos los bytes, usamos int32_t y demas pero sigue pasando.
La cosa esta en que en Ubuntu funciona perfectamente y no entendemos por que, es simplemente un send y recv de sizeof(header)...
Saludos!