2016-05-18 16 views
1

Ich schreibe ein Programm, das zwei Clients (Peer-to-Peer) benötigt, um ohne Verwendung irgendeines Servers, auch nur im Matchmaking-Prozess, eine Verbindung herzustellen. Beide Clients kennen bereits ihre öffentlichen und privaten IPs. Einer oder beide Clients können hinter einem NAT sein. Ich kann mich nicht auf IPv6 verlassen.C# UDP-Punch-Through ohne Rendevous-Server

Das Problem, auf das ich stoße, ist, dass ein Client (wir nennen sie A) das Paket an das andere senden (B), das ein Loch in A's NAT schlägt und Bs NAT passiert, das bereits gelocht wurde. Dies erfordert jedoch, dass A den externen Port auf Bs NAT kennt, den B durchgestoßen hat, da der lokale Port von B hinter dem NAT nicht verwendet werden kann. Außerdem kann B diesen Port nicht hinter seinem NAT erkennen. Visual representation of my problem Gibt es eine Möglichkeit, diesen Port zu erkennen, oder lassen Sie B einfach dem NAT mitteilen, welchen Port er verwenden soll?

Vielen Dank im Voraus.

P.S. Ich verwende die Version von .NET Unity, etwa 2.0.

P.P.S. Wenn Sie eine Lösung haben, die mit TCP funktioniert, nehme ich das auch!

P.P.S. Oder so ziemlich jedes Protokoll außer Http!

Antwort

1

Sie müssen einen gut bekannten öffentlichen Server haben, um zwischen den 2 Endpunkten zu verhandeln.

Hier ist eine gute Umsetzung dieses Konzeptes in C#: https://github.com/7wingfly/P2Pchat