sisoputnfrba / foro

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

Problemas con la Serializacion-Deserializacion #1448

Closed ncoen97 closed 5 years ago

ncoen97 commented 5 years ago

👋 ¡Hola!

Estamos teniendo problemas con la serializacion y deserializacion de listas entre dos pcs. Probando las funciones en un solo programa (probando en el main) funciona bien, el problema esta cuando queremos hacerla entre dos módulos. Siempre lee mal algún byte termina rompiendo toda la función. El primer elemento de la lista siempre lo lee bien, en el segundo lo empieza a leer bien pero en alguna variable lee algo mal.

void* serializame_todos_los_inserts(t_list* multiples_inserts){
    uint32_t cantidad_de_inserts = list_size(multiples_inserts);
    uint32_t bytes_totales = tamanios_de_todos_los_inserts(multiples_inserts,cantidad_de_inserts);
    void* magic = malloc(bytes_totales+sizeof(uint32_t)*3);
    uint32_t puntero = 0;
    uint32_t comando = MULTIPLES_INSERTS;
    memcpy(magic+puntero,&comando,4);
    puntero += 4;
    memcpy(magic+puntero,&cantidad_de_inserts,4);
    puntero += 4;
    memcpy(magic+puntero,&bytes_totales,4);
    puntero += 4;

    for(uint32_t i=0;i<cantidad_de_inserts;i++){
        t_insert* insert = list_get(multiples_inserts,i);
        memcpy(magic+puntero,&insert->size_nombre,4);
        puntero += 4;
        memcpy(magic+puntero,insert->nombre_tabla,insert->size_nombre);
        puntero += insert->size_nombre;
        memcpy(magic+puntero,&insert->key,2);
        puntero += 2;
        memcpy(magic+puntero,&insert->size_value,4);
        puntero += 4;
        memcpy(magic+puntero,insert->value,insert->size_value);
        puntero += insert->size_value;
        memcpy(magic+puntero,&insert->timestamp,8);
        puntero += 8;
    }

    return magic;
}
t_list* deserializame_todos_los_inserts(void* magic,uint32_t cantidad_de_inserts){
    t_list* inserts = list_create();
    uint32_t puntero = 0;
    for(uint32_t i = 0;i< cantidad_de_inserts;i++){
        t_insert* insert = malloc(sizeof(t_insert));
        memcpy(&(insert->size_nombre),magic+puntero,4);
        puntero += 4;
        insert->nombre_tabla = malloc(insert->size_nombre);
        memcpy(insert->nombre_tabla,magic+puntero,insert->size_nombre);
        puntero += insert->size_nombre;
        memcpy(&(insert->key),magic+puntero,2);
        puntero += 2;
        memcpy(&(insert->size_value),magic+puntero,4);
        puntero += 4;
        insert->value = malloc(insert->size_value);
        memcpy(insert->value,magic+puntero,insert->size_value);
        puntero += insert->size_value;
        memcpy(&(insert->timestamp),magic+puntero,8);
        puntero += 8;
        list_add(inserts,insert);
    }
    return inserts;
}

Por ejemplo, mandamos: { uint32_t size_nombre = 7 char nombre_tabla = "frutas" uint16_t key = 1 uint32_t size_value = 7 char value = "banana"
uint64_t timestamp = 123456789 , uint32_t size_nombre = 7 char nombre_tabla = "frutas" uint16_t key = 2 uint32_t size_value = 8 char value = "manzana"
uint64_t timestamp = 123456789 } Y llega: uint32_t size_nombre = 7 char nombre_tabla = "frutas" uint16_t key = 1 uint32_t size_value = 7 char value = "banana"
uint64_t timestamp = 123456789 , uint32_t size_nombre = 7 char nombre_tabla = "frutas" uint16_t key = 2 uint32_t size_value = 8 char value = "manzecib!\n"
uint64_t timestamp = 3828171163979310185 } Espero que nos den una idea de cual puede ser el problema, sobre todo porque en el primero funciona y en el segundo no, y si lo probamos en el main también funciona. Saludos.

mgarciaisaia commented 5 years ago

¡Buenas!

Pinta complicado, che, ¿no?

¿Averiguaron algo más?

Yo correría ambos procesos con Valgrind, a ver en dónde se está escapando la tortuga. Porque da la sensación de estar pisando memoria, o que se te estén mezclando recvs de distintos send.

En lo que compartiste no encontré el error, pero eso no significa que no esté. Y un poco también me falta ver otras partes del código que pueden ser relevantes.

Pero arrancaría por valgrind, y después ver si los caracteres falopa esos se enviaron mal o se recibieron mal (imprimir byte a byte lo que se envía y recibe, o probar tcpdump/wireshark).

Tenenos al tanto.

mgarciaisaia commented 5 years ago

¿Qué pasó, che?

ncoen97 commented 5 years ago

Había un problema en la función mandar 0.0 no nos estaba tomando los bytes del header, pero ya lo arreglamos. Logramos darnos cuenta con el tcpdump :). Cierro issue.