Pregunta

¿Alguien puede dar un ejemplo de un puñetazo en agujero UDP?

En realidad, quiero escribir un programa de chat con el que las personas puedan chatear cuando conocen la IP del otro. Pero ambas máquinas estarán detrás de un enrutador de firewalled. Por lo tanto, necesito hacer un hoyo para comunicarme.

Me gustaría una función de tal manera que al llamar a la función, se habría perforado un agujero y las comunicaciones futuras se seguirían adelante fácilmente, si eso no es demasiado para pedir :)

¿Fue útil?

Solución

Respuesta corta: no se puede hacer de manera confiable.

Respuesta larga:

"Hole Punching" se refiere a la activación de las reglas automáticas NAT de un enrutador para permitir el tráfico entrante. Cuando envía un paquete UDP, el enrutador (generalmente) crea una regla temporal que asigna su dirección de origen y puerto a la dirección y puerto de destino, y viceversa. Los paquetes UDP que regresan desde la dirección de destino y el puerto (y ningún otro) se pasan a la dirección y el puerto de origen original (y ningún otro). Esta regla temporiza después de algunos minutos de inactividad.

Hacer que esto funcione cuando ambos puntos finales estén detrás de NATS o firewalls requerirían que ambos puntos finales envíen paquetes a otro aproximadamente al mismo tiempo. Esto significa que ambas partes necesitan saber cada uno público Direcciones IP y números de puerto y necesita comunicar esto a cada uno por otros medios.

No hay forma de que un programa determine directamente su propia dirección IP pública si está detrás de un NAT (solo verá su dirección privada, como 192.168.x.x). Pero dado que supone que los humanos involucrados conocen las direcciones IP de cada uno, esos humanos pueden escribir la dirección del otro.

Pero la verdadera captura es que tampoco hay forma de que un programa determine directamente qué número de puerto está utilizando el enrutador en el lado público. Su programa puede estar vinculado a 12345 en la máquina local, pero el enrutador puede asignarlo a casi cualquier puerto en el lado público. (Imagine que dos computadoras en su red local se envían desde el puerto 12345, obviamente el enrutador tendrá que asignar una de ellas a un número diferente). Por lo tanto, aunque usted y los humanos puedan saber a qué número de puerto local está obligado, hay No hay forma de saber qué número de puerto mostrará el enrutador al mundo.

Otros consejos

La biblioteca de redes de Lidgren tiene esta funcionalidad incorporada. Después de agregar la biblioteca a su aplicación, instanciaría un NetServer, tendrá dos netclients Connect y llamará a NetServer.IntroDuce ().

Enlace a Lidgren: https://github.com/lidgren/lidgren-network-gen3

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top