sisoputnfrba / foro

Foro de consultas para el trabajo práctico
148 stars 7 forks source link

Problema recibiendo header #1098

Closed agusmoles closed 6 years ago

agusmoles commented 6 years ago

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!

tferraro commented 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:

iago64 commented 6 years ago

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 :)

agusmoles commented 6 years ago

Lo que envia el ESI:

tamano esi

Lo que recibe el Coordinador (en maq. virtual):

tamano coordinador

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!

iago64 commented 6 years ago

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.-

agusmoles commented 6 years ago

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!

iago64 commented 6 years ago

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;
agusmoles commented 6 years ago

Claro, somos unos capos...

Gracias por contestar tan rapido!

Cualquier duda vuelvo a abrir. Saludos!