2010-12-20 11 views
5

Ich schreibe eine einfache P2P-Anwendung, um die Machbarkeit der Verwendung von UDP-Lochen in einem größeren Projekt zu testen.UDP-Lochung: Testbarkeit auf einer Maschine

Ich habe gestern meine Test-Apps von zu Hause aus getestet und sie haben funktioniert.

Allerdings bin ich jetzt bei der Arbeit und der gleiche Code macht nicht mehr den Job. Der Absender sendet hier an den entsprechenden Port auf der externen IP-Adresse unseres Routers, aber der Empfänger erhält keine davon.

Vor dem Aufruf UdpClient.Receive() sendet die empfangende App ein Paket an den IP: Port, den es abhört. Auch dies funktioniert auf meinem Heim-Setup, aber nicht hier. Das Ergebnis ist das gleiche, unabhängig davon, ob die Windows-Firewall ein- oder ausgeschaltet ist. Das ist also nicht das Problem.

Könnte es sein, dass die Router die Situation anders handhaben?

EDIT1: Beide Apps laufen auf demselben Rechner.

+0

Funktioniert Ihr Router irgendeine Art von NAT? Benötigt es eine Portweiterleitung?Gibt es irgendeine Art von Firewall (auf dem Router oder einer anderen Appliance) zwischen Sender und Empfänger? – Lazarus

+0

Beide Router sind typische SOHO-NAT-Router. Bei beiden sind die Firewall-Funktionen deaktiviert. Die Idee ist, Portweiterleitung zu vermeiden. :) – dandan78

+0

Ich würde wireshark verwenden, um alles auf einer Netzwerkebene zu betrachten. – weismat

Antwort

2

In der Antwort auf meine eigene Frage:

Die Router wurden in der Tat ein anderes Verhalten zeigen.

Mein Heimrouter ist nur an meinen Laptop angeschlossen. Ich nehme an, das ist der Grund, warum, wenn ich ein UDP-Paket von Port n aussende es auch den Router auf Port n verlässt.

Jedoch besteht Firmennetzwerk von mehreren Computern und der Router randomisiert den Port, an seinem Ende, was bedeutet, dass ein Paket von Port y die Router auf port x verlassen wird gesendet.

Ich habe erfolgreich durch NAT zu kommunizieren, ohne die Portweiterleitung auf die folgende Weise unter Verwendung meines Haus und Arbeitsmaschinen worden:

H - Sendet Paket von Port A bis W: b, wobei Port A für eingehende Verbindungen Öffnung

W - Sendet das Paket an H: a und wechselt in den Empfangsmodus. Es hat jetzt auch einen offenen Port.

H - Empfängt Paket von W und anstatt anzunehmen, auf welchen Port zu antworten, überprüft das Paket seinen Quellport und verwendet diesen stattdessen.

H - Sendet Paket an W: source port

W - Empfängt Pakets.

Voila.

In der Praxis würden tho, H und W einen Server kontaktieren, um Verbindungsdetails auszutauschen, was die Sache vereinfacht, da der Server genau weiß, von welchen Ports H und W gesendet werden.

0

Ich denke, dass Ihr Problem ist, dass beide Apps im selben LAN ausgeführt werden. UDP-Lochung erfordert, dass eine der Seiten eine Portweiterleitung hat.

Skype verwendet Man-in-the-Middle, wenn beide Seiten hinter NAT ohne Portzuordnungen stehen. Deshalb können Dateiübertragungen manchmal so langsam sein.

+0

Vorausgesetzt, dass ich dies funktioniert, wird die End-Lösung einen Port-Server weiterleiten, um die P2P-Verbindungsdetails zwischen zwei NATted-Clients anzuordnen. Jetzt versuche ich nur zu sehen, wie das im Allgemeinen funktioniert. Wenn ich beide NAT-Computer fest codiere, zum Beispiel an feste Ports senden und empfangen, ist kein Zwischenschritt erforderlich. Maschine A beginnt zu senden, Maschine B beginnt zu senden, und da beide auch empfangen und die ersten Pakete, die sie gesendet haben, ein Loch in ihre jeweiligen NATs geworfen haben, sollten die Dinge in Ordnung sein, oder? Es sei denn, sie befinden sich anscheinend im selben LAN. – dandan78

+0

Sie können niemals zwei Maschinen miteinander kommunizieren lassen, wenn beide Maschinen ohne Port-Mappings hinter NAT stehen. Es gibt also keine Möglichkeit, ein Loch durch das NAT zu errichten. Sie können alles senden, was Sie wollen, aber es wird von den anderen Clients FW/Router ignoriert. – jgauffin