IIC2233 / syllabus-2020-2

Repositorio oficial del curso IIC2233 Programación Avanzada 🎉🎊
https://iic2233.github.io
7 stars 57 forks source link

Aleatoriamente el envio de datos entre cliente y servidor falla #1059

Closed Lord-Kelsier closed 3 years ago

Lord-Kelsier commented 3 years ago

Prerrequisitos

(Marcar colocando una X entre los corchetes los ítems que ya hiciste, así: "[X]")

Duda

Hola, busco ayuda para resolver un problema, la busco aqui pues es un problema que no ocurre siempre, es aleatorio, si ocurriera cada vez que hiciera algo podria encontrar el origen, pero no puedo forzar que ocurra de ninguna forma. El problema es que cuando se envian datos desde el servidor hasta el cliente a veces llegan mal, pero no es que llegue mal ordenado el indice del paquete, sino que llegan corridos, es decir, mi programa lee los primeros 4 luego los siguientes 64, mirando que el primero sea el indice del paquete y aveces los 4 bytes del indice corresponden a parte del mensaje (en resumen llegan corrido).

Esto me llevaria a pensar que hice algo mal, pero la mayoria de veces el programa funciona, se envian bien los datos, entonces el codigo deberia estar bien no? pues sino no funcionaria nunca. Aun asi tengo un sospechoso:

Como duda extra: En los apuntes mencionaron que era recomendable que en el rcv() se pusiera una potencia pequña de 2, ¿esto aplica tambien para el sendall()? (es decir que se envien bytes cuyo largo es una potencia de 2)

DCCollao commented 3 years ago

Hola @Lord-Kelsier!

Según la información que proporcionaste, creo que debe ser que no estás leyendo correctamente el mensaje según su largo. Cuando un socket recibe información, crea internamente una "cola" de lo que le falta por leer, y desde esa cola va sacando la información por trocitos del tamaño que le hayas indicado. Esto genera un problema que buscaré aclarar con el siguiente flujo:

  1. Cliente envía un primer mensaje de 60 bytes
  2. Cliente envía segundo mensaje de 60 bytes
  3. Servidor comienza a leer su cola de mensajes, tomando chunks de 64 bytes cada uno
  4. El primer mensaje que lee el servidor consta de los 60 bytes del primer mensaje, y además los 4 primeros bytes del segundo mensaje
  5. Luego de leer el primer mensaje, quedan 56 bytes en la cola del servidor, por lo que simplemente lee ese mensaje incompleto.

Es por esto que es importante que se rellene con bytes 0 cuando el bloque no llega al largo especificado, como se indica en el diagrama del enunciado: image