UDP perforación de falla específica del host

Escribí un programa que configura enlaces de igual a igual. El programa, que se puede encontrar enhttp: //basyl.co.uk/code/punch/doc/files/Readme-txt.htm, consta de dos partes: un servidor que se ejecuta en un host público; y un cliente que es utilizado por cada extremo del enlace de igual a igual deseado.

Tengo acceso a dos servidores públicos: 'bonn' (home.contextshift.co.uk) y 'entropy' (home2.contextshift.co.uk)

Si el servidor está en bonn y los clientes se ejecutan en bonn, entropy y en mi PC doméstica (detrás de NAT), una conexión perforada de entropy puede comunicarse con mi PC sin problemas. Sin embargo, una conexión de bonn a la PC falla; Los datos de la PC llegan a Bonn, pero los datos de Bonn a través del agujero NAT nunca llegan.

Si el servidor está en entropía y nuevamente, los clientes se ejecutan en bonn, entropía y mi PC, las conexiones perforadas funcionan bien entre todos los clientes.

Esto es confuso ya que el servidor no está involucrado en el flujo de datos punto a punto. Si todavía estás conmigo, aquí está el flujo:

Cliente-A se conecta al servidor en un enlace TCP y obtiene un token único;

Client-B se conecta al servidor en un enlace TCP y obtiene un token único;

Client-A y Client-B reciben actualizaciones a través de su enlace TCP diciéndoles quién más está conectado;

El Cliente-A (o B) envía una solicitud al Servidor a través de un enlace UDP recién creado que pasa su token y el nombre del Cliente-B;

El servidor identifica al Cliente-A desde el token y reenvía la solicitud al Cliente-B a través de su enlace TCP, incluida la dirección UDP / número de puerto de A en la solicitud;

El Cliente-A (o B) envía una confirmación al Servidor a través de un enlace UDP recién creado, pasando su token y el nombre del Cliente-A;

El servidor identifica al Cliente-B desde el token y reenvía la solicitud al Cliente-A a través de su enlace TCP, incluida la dirección UDP / número de puerto de B en la solicitud;

A y B ahora tienen la dirección UDP / puerto del otro y pueden hacer ping entre sí e intercambiar datos.

omo puede ver, el Servidor nunca habla sobre los enlaces UDP creados por los Clientes para sus solicitudes, solo en los enlaces TCP.

n resumen, el cliente no funciona en un host particular cuando el servidor está en el mismo host. ¿Alguna sugerencia por las razones de este comportamiento o por las formas en que podría investigar esto más a fondo?

Tenga en cuenta que esta prueba es artificial porque el objetivo de la perforación es hablar entre dos hosts, ambos detrás de NAT. De hecho, esto funciona, esté donde esté el servidor, por lo que el problema podría considerarse académico.

enga en cuenta también que antes de escribir el programa, intenté usar una aplicación pública llamada 'NatCheck'. Esto también falló de manera similar, aunque no lo investigué mucho: requirió tres hosts públicos y lo modifiqué para usar solo los dos. Cuando no funcionó, asumí que me había equivocado de alguna manera y descarté la aplicación.

Cualquier comentario sobre el código también es muy bienvenido (probablemente lo publicaré en el sitio de revisión de código).

Respuestas a la pregunta(6)

Su respuesta a la pregunta