socketverbindung p2p übers Internet hinter einem Router
Verfasst: Sonntag 24. August 2008, 17:24
Hallo zusammen,
ich habe mich vor einiger Zeit etwas über Sockets schlaugemacht und habe auch
schon einfache Sachen übers LAN ausprobiert. Allerdings scheitern meine Versuche,
eine Verbindung mit einem Client außerhalb des LANs herzustellen,
was meiner Meinung nach auch kein Wunder ist,
da man hier ja im seltensten Fall "direkt" an den Client herankommt.
Hier mal ein Bild:

Mal angenommen, ich wäre Client1 und erfrage beim Server
(dessen Adresse in meinem Programm fest eingegeben ist)
die IP-Adresse von Client3, um eine direkte Verbindung mit ihm aufzubauen.
Der Server würde mir doch dann die IP-Adresse von Router-B zurückgeben.
Mit dieser IP-Adresse kann ich jedoch nur Router-B anschreiben und nicht
Client3.
Die Frage ist nun, wie ich über ein Socket mit Client 2, 3 oder 4 kommunizieren kann,
wenn ich doch immer nur die IP-Adresse von den Routern A und B bekomme.
Wenn meinetwegen Client3 so horcht:
und Client1 versucht, so eine Verbindung aufzubauen:
In diesem Beispiel würde die Anfrage von Client1 doch garnicht bei
Client3 ankommen, oder? Woher sollte Router-B wissen, an welchen der beiden Clients die Anfrage soll? (Mal angenommen, alle Ports sind offen)
Hat jemand eine Idee?
Irgendwie muss es ja gehen, bei ICQ werden Dateitransfers
ja auch nicht über den Server umgeleitet, sondern direkt geschickt
(zumindest bis Version 5)
ich habe mich vor einiger Zeit etwas über Sockets schlaugemacht und habe auch
schon einfache Sachen übers LAN ausprobiert. Allerdings scheitern meine Versuche,
eine Verbindung mit einem Client außerhalb des LANs herzustellen,
was meiner Meinung nach auch kein Wunder ist,
da man hier ja im seltensten Fall "direkt" an den Client herankommt.
Hier mal ein Bild:

Mal angenommen, ich wäre Client1 und erfrage beim Server
(dessen Adresse in meinem Programm fest eingegeben ist)
die IP-Adresse von Client3, um eine direkte Verbindung mit ihm aufzubauen.
Der Server würde mir doch dann die IP-Adresse von Router-B zurückgeben.
Mit dieser IP-Adresse kann ich jedoch nur Router-B anschreiben und nicht
Client3.
Die Frage ist nun, wie ich über ein Socket mit Client 2, 3 oder 4 kommunizieren kann,
wenn ich doch immer nur die IP-Adresse von den Routern A und B bekomme.
Wenn meinetwegen Client3 so horcht:
Code: Alles auswählen
#socketobjekt erzeugen
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Port 2000 abhören
listener.bind(('', 2000))
# warten, bis jemand eine Verbindung anfordert
listener.listen(5)
# Verbindung bestätigen
conn, addr = listener.accept()
Code: Alles auswählen
# Socketobjekt erzeugen
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Versuchen, mit Client3 eine Verbindung aufzunehmen
conn.connect(("84.20.12.149", 2000))
Client3 ankommen, oder? Woher sollte Router-B wissen, an welchen der beiden Clients die Anfrage soll? (Mal angenommen, alle Ports sind offen)
Hat jemand eine Idee?
Irgendwie muss es ja gehen, bei ICQ werden Dateitransfers
ja auch nicht über den Server umgeleitet, sondern direkt geschickt
(zumindest bis Version 5)