Práctico 3 - Ejercicio 5

Práctico 3 - Ejercicio 5

de Santiago Freire Lopez -
Número de respuestas: 3

Hola, buenas tardes. Espero que estén bien.

Realizando el ejercicio 5 del práctico 3 me surgió una duda que es más conceptual que otra cosa. Resulta que en este ejercicio hay que enviar datos a los mismos dos servidores, en distintos hilos de ejecución, que son de vida bastante corta, ya que - al menos en mi implementación - es uno por cada solicitud recibida.

Mi duda es si es correcto utilizar dos sockets comunes, uno por cada servidor, para enviar estos datos al servidor de destino. Se crearían en el procedimiento que luego crea los threads, y se pasan como parámetro a la función que se ejecuta en hilos. De esta forma evito crear un (potencialmente gran) número de conexiones TCP que podrían ser en definitiva evitadas.

Tengo entendido que esto introduce problemas al estar más de un proceso enviando datos al mismo socket, por lo que introducí un semáforo de mutuo-exclusión para el envío del mensaje a socket.send() (haciendo P antes de iniciar el envío y V al finalizarlo, utilizando la sintaxis que vimos en Sistemas Operativos) para evitar potenciales problemas de concurrencia. Quería saber también si esta solución se considera correcta, o es mejor utilizar uno por cada conexión y así este problema no ocurre.

Jorge en un mensaje al foro de hace un tiempo decía que "Si tenés dos [sockets] leyendo o dos escribiendo probablemente haya un problema en tu diseño.”. Sin embargo considero que esta forma de implementarlo, cuidando la concurrencia, podría llegar a ser correcta. Pero por supuesto, me gustaría confirmarlo.

Muchas gracias!

Santiago

En respuesta a Santiago Freire Lopez

Re: Práctico 3 - Ejercicio 5

de Jorge Visca -
Cómo procesa tu programa la respuesta desde el servidor hacia el cliente? Y luego, qué pasaría en tu programa si hubiera dos clientes intentando descargar un objeto grande desde serviciouno.uy a la vez?

Un detalle, por lo que veo tu programa intenta enviar un mensaje completo poniendo P() y V() alrededor del "repeat send", pero fijate que tu lectura es un único receive, que no garantiza haber leído el mensaje completo.

En respuesta a Jorge Visca

Re: Práctico 3 - Ejercicio 5

de Santiago Freire Lopez -
Hola Jorge, gracias por la respuesta.

Efectivamente, no estoy procesando la respuesta del servidor hacia el cliente, eso fue un error mío. Se ve que me había quedado con otra idea cuando lo estaba haciendo.

Para poder obtener el mensaje completo y poder descargar más de un objeto concurrentemente de un mismo host - cosa que no había considerado en el diseño original - veo que la solución más razonable es tener un socket por cada thread.

Gracias!