es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo afecta el conectar() de un socket enlazado con bind() en un proceso bifurcado al socket en el proceso padre?

Estoy implementando una aplicación confiable y orientada a la conexión sobre UDP (tarea universitaria). Se requiere que el servidor, después de recibir un paquete inicial del cliente y confirmarlo, cree un nuevo proceso de trabajo. El proceso de trabajo deberá tener un socket dedicado a este cliente en particular.

Ahora veo tres formas de implementar esto.

  1. El servidor tiene un socket, llamémoslo listener_socket, que está enlazado al puerto especificado y espera solicitudes. Podría entonces, en el proceso hijo, realizar connect() a este mismo socket usando la dirección del cliente.
  2. O puedo cerrar listener_socket por completo en el proceso hijo, y luego abrir un nuevo socket totalmente nuevo, connection_socket, enlazarlo al puerto y conectarlo al cliente.
  3. O puedo abrir un nuevo socket en un nuevo puerto y hacer que el cliente maneje este nuevo puerto durante el resto de la conexión.

Lo que no estoy seguro (con respecto a la opción 1) es cómo afectaría conectar el listener_socket al cliente al listener_socket original en el servidor padre. ¿Evitará que el padre reciba mensajes adicionales de otros clientes? Si no es así, ¿por qué? ¿No se refieren ambos, en última instancia, al mismo socket?

En cuanto a la opción 2, esto me da, bastante esperadamente, “address already in use” (dirección ya en uso). ¿Existe alguna funcionalidad similar a la de los enrutadores (es decir, concordancia de prefijo más largo) que entregue datagramas al socket “más apropiado”? (Bueno, TCP ya hace esto en accept(), así que es poco probable que esta lógica se pueda replicar para UDP).

En cuanto a la opción 3, creo que es bastante ineficiente, ya que implica que debo usar un nuevo puerto para cada cliente.

Entonces, ¿alguien podría por favor asesorarme sobre qué método usar, o si hay otra forma que aún no conozco? Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La opción 1 es el enfoque recomendado para implementar una aplicación confiable y orientada a la conexión sobre UDP. Sin embargo, es importante tener en cuenta que la conexión del listener_socket al cliente no afectará al socket original en el servidor padre. El proceso hijo tendrá su propio socket separado que está conectado al cliente, y el servidor padre seguirá recibiendo mensajes de otros clientes en su propio listener_socket.

    La opción 2 no es factible ya que resultará en el mensaje de error “address already in use”, como has observado. No hay funcionalidad en UDP que permita que múltiples sockets compartan la misma dirección y puerto.

    La opción 3 no es recomendada ya que es ineficiente y requiere una gran cantidad de puertos reservados.

    Por lo tanto, el enfoque recomendado es utilizar la opción 1 y crear un nuevo proceso de trabajo con un nuevo socket que esté conectado a la dirección del cliente. Esto permite una comunicación confiable y orientada a la conexión entre el servidor y el cliente, al mismo tiempo que permite al servidor padre recibir mensajes de otros clientes.

Comments are closed.