Question

Quelqu'un peut-il donner un exemple de perforation UDP?

En fait, je veux écrire un programme de chat avec lequel les gens peuvent discuter lorsqu'ils connaissent l'adresse IP de l'autre.Mais les deux machines seront derrière un routeur pare-feu.Donc, j'ai besoin de percer un trou pour communiquer.

Je voudrais une fonction telle qu'en appelant la fonction, un trou aurait été percé et les futures communications se déplaceraient facilement - si ce n'est pas trop demander :)

Était-ce utile?

La solution

Réponse courte: cela ne peut pas être fait de manière fiable.

Réponse longue:

"Hole Punching" fait référence au déclenchement de règles NAT automatiques d'un routeur afin d'autoriser le trafic entrant. Lorsque vous envoyez un paquet UDP, le routeur crée (généralement) une règle temporaire mappant votre adresse source et votre port à l'adresse et au port de destination, et vice versa. Les paquets UDP retournant de l'adresse et du port de destination (et aucun autre) sont transmis à l'adresse et au port source d'origine (et aucun autre). Cette règle expirera après quelques minutes d'inactivité.

Pour que cela fonctionne lorsque les deux points d'extrémité sont derrière des NAT ou des pare-feu, il faudrait que les deux points d'extrémité s'envoient des paquets à peu près au même moment. Cela signifie que les deux parties doivent connaître les adresses IP et les numéros de port publics de l'autre et doivent se communiquer cela par d'autres moyens.

Il n'y a aucun moyen pour un programme de déterminer directement sa propre adresse IP publique s'il se trouve derrière un NAT (il ne verra que son adresse privée, telle que 192.168.x.x). Mais puisque vous supposez que les humains impliqués connaissent les adresses IP des uns et des autres, ces humains peuvent simplement taper l'adresse de l'autre.

Mais le vrai problème est qu'il n'y a pas non plus de moyen pour un programme de déterminer directement quel numéro de port le routeur utilise du côté public. Votre programme peut être lié à 12345 sur la machine locale, mais le routeur peut mapper cela à presque n'importe quel port du côté public. (Imaginez deux ordinateurs sur votre réseau local envoyant tous les deux depuis le port 12345, le routeur devra évidemment mapper l'un d'entre eux sur un numéro différent.) Donc, même si vous et les humains savez à quel numéro de port local vous êtes lié, il y a aucun moyen de savoir quel numéro de port le routeur montrera au monde.

Autres conseils

La bibliothèque réseau de Lidgren a cette fonctionnalité intégrée.Après avoir ajouté la bibliothèque à votre application, vous instanciez un NetServer, connectez deux NetClients et appelez NetServer.Introduce ().

Lien vers Lidgren: https://github.com/lidgren/lidgren-network-gen3

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top