varios sockets UDP, vinculados al mismo puerto?

Primero, no se trata de "cómo enlazar al puerto de otro software".

ahora, tengo una aplicación cliente-servidor, basada en TCP y me gustaría convertirla en UDP, pero me falta algo ...

tengo 2 reglas (que puse) para esta aplicación:
1) el "servidor" puede permanecer detrás del enrutador sin ninguna configuración de reenvío de puertos.
2) el "cliente" puede escuchar solo un puerto.

en TCP lo hago así:
1) el servidor abre la conexión inicial al cliente en el puerto X.
2) cuando el cliente quiere abrir un canal de comunicación al servidor, usa el socket inicial para pedirle al servidor uno nuevo.
3) el servidor crea un nuevo socket y se conecta al cliente en el puerto X. 4) el cliente acepta esta nueva conexión en el puerto X, y ahora el cliente habla con el servidor en este nuevo socket.

de esta manera puedo tener múltiples conexiones en el mismo puerto.

en UDP, tengo un pequeño problema ..
1) el servidor envía el programa de conexión inicial al cliente en el puerto X.
2) cuando el cliente quiere abrir un canal de comunicación al servidor, envía una solicitud de un nuevo socket a la dirección del socket inicial.
3) el servidor recibe el mensaje, crea un nuevo socket udp y lo usa para enviar datos al cliente en el puerto X.
4) el cliente recibe el nuevo dgram y ....?

Básicamente, lo que quiero que suceda ahora es "aceptar" esta conexión. lo que significa: crear un nuevo socket UDP, vincularlo también al puerto X y recibir datos solo de esa dirección de socket entrante específica (ip, puerto). pero no puedo hacer eso porque no puedo vincular varios zócalos al mismo puerto.
entonces, ¿cuál es la forma de crear múltiples conexiones udp en un puerto? (en red, no solo cree un búfer de anillo de dgrams y envíelo al conector correcto)

Gracias :)

preguntado el 09 de enero de 11 a las 10:01

No puede tener "conexión" con UDP porque UDP no es un protocolo "conectado" sino un protocolo de datagramas. -

y tuve mucho cuidado de no decir la palabra "conexión" en el asunto UDP. cuando digo "conexión", me refiero a abrir una puerta para responder ... así que lo que quiero es que el lado del servidor (que está bloqueado desde el exterior) envíe un dgram UDP al cliente, para que el cliente pueda luego enviar dgram a ese socket, y recibir dgrams solo de ese socket específico (como tcp accept) era posible, si pudiera vincular un nuevo socket en el mismo puerto y recibir datos solo del (ip, puerto) que quiero. -

@sfk A pesar de que UDP es un protocolo sin estado, la llamada connect () influye de manera importante en las operaciones de socket. Por ejemplo, en FreeBSD, no puede obtener errores (como destino ICMP inalcanzable) del socket UDP a menos que esté conectado. -

1 Respuestas

Como UDP es un protocolo sin conexión, en el paso 4 verifica el contenido del mensaje UDP y decide cómo manejarlo. En otras palabras, el tipo de mensaje se define solo por su contenido.

Sin embargo, tengo la sensación de que todo su diseño está un poco mal. Es mucho más común para cliente estar detrás del firewall (solo porque existen más clientes que servidores). Si necesita poner el servidor detrás de un firewall, simplemente configure el firewall para permitir conexiones al conjunto de puertos. Incluso cuando solo tiene un puerto más abierto, nada impide que el cliente se conecte al mismo puerto del servidor varias veces en paralelo.

Respondido el 09 de enero de 11 a las 13:01

Bueno, esta solución significa simplemente cambiar el diseño del software y el protocolo para que en cada programa haya un encabezado que diga qué debo hacer con él. Estoy buscando algo que no cambie el diseño para poder cambiar fácilmente entre los modos TCP y UDP. sobre lo del servidor-cliente ... el "servidor" es un teléfono móvil ... así que no tengo una IP válida. - RoeeK

@RoeeK sí, porque su "diseño" actual está lejos de ser óptimo. - Devolución de llamada de Eugene Mayevski

No puedo pensar en una mejor manera de crear una comunicación servidor-cliente donde el servidor no tiene una dirección IP válida. por eso es tan extraño ... porque para que el cliente pueda hablar con el servidor, el servidor necesita abrir un socket en el lado del cliente ... lo que hace que el lado del cliente sea un servidor ... así que simplemente puse la terminología más clara que yo podría ... pero en realidad ambos lados son clientes y servidores - RoeeK

@RooeK Creo que necesita cambiar los términos del cliente y del servidor, luego piénselo de nuevo y descubra que la tarea se ha resuelto muchas veces antes. Su "cliente" es un servidor, y lo que hace es similar al servidor FTP en modo pasivo, donde el servidor le dice al cliente en qué puerto se debe establecer la conexión de datos. - Devolución de llamada de Eugene Mayevski

@RoeeK La conexión TCP establecida se define mediante 4 "atributos": dirección del servidor, puerto del servidor, dirección del cliente y puerto del cliente. Por eso es suficiente: esta combinación siempre es única. En UDP tiene un "buzón" en cierta dirección y puerto. Recibe los mensajes que se le envían y luego puede enviarlos en función de su contenido y de la información sobre la dirección IP que envió esos mensajes. Pero la dirección IP no es única (puede tener varios remitentes en la misma computadora), por lo que si usa una sola dirección y puerto para un "buzón", debe enviar mensajes según su contenido. - Devolución de llamada de Eugene Mayevski

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.