ich habe eine Frage, welche im Rahmen der Socket-Programmierung in Python aufgetreten ist.
Diese bezieht sich jedoch nicht lediglich auf Python, doch ich hoffe, dass ihr mir trotzdem weiterhelfen könnt.
Ich versuche meine Frage anhand eines kleinen, äußerst simplen Beispieles zu erklären.
Nehmen wir an der Server (s. unten) wird auf einem Rechner gestartet, welcher hinter einem ( NAT - ) Router sitzt. Dieser lauscht nun nach eingehenden Verbindungen auf dem Port 55555. Damit der Server auch Verbindungen annehmen kann, welche außerhalb seines Lan - / WLAN Netzwerkes liegen, ist auf dem Router Portweiterleitung eingerichtet. Alle eingehenden TCP Verbindungen auf Port 55555 werden also an den Rechner weitergeleitet, auf welchem der Server läuft. Nun kommen wir zu dem Client (s. unten). Diesen starten wir auf einem Rechner, welcher sich hinter einem anderen ( NAT - ) Router befindet. Dieser sendet eine Verbindungsanfrage an den Server. Dazu wird als IP-Adresse die WAN-IP des Routers benutzt, hinter welchem der Server sitzt. Als Port wird (natürlich) auch 55555 genutzt. Der Router sendet die Verbindungsanfrage an den Server weiter, welcher diese akzeptiert. Der Client sendet daraufhin, wie man unten sehen kann, eine Anfrage an den Server und möchte eine MP3 Datei vom Server herunterladen. Die Anfrage landet wieder beim Router, hinter dem der Server sitzt und dieser leitet erneut die Anfrage weiter. Da die MP3 Datei zu groß ist um in einem Datenpacket transferiert zu werden / empfangen zu werden, wird sie in einzelne Parts 'geteilt', welche dann nacheinander zum Client gesendet werden. Die einzelne Packete wandern nacheinander über den Router des Clients, da dies ja die 'Absendeadresse' der Anfrage ist. Der Router des Clients 'merkte' sich die IP-Adresse, des PC's in seinem Lan - / WLAN Netzwerk, welcher die Anfrage an den Server - bzw. an die IP-Adresse des Routers, hinter welchem der Server sitzt - gesendet hat und leitet dann grundsätzlich die Antworten des Servers an den PC, auf welchem der Client läuft, weiter. Und HIER schneidet jetzt meine Frage ein. Ich habe doch eigentlich nur eine Anfrage an den Server gesendet und zwar die 'Downloadanfrage'. Werden trotzdem alle nun einkehrenden Datenpackete an dem Router, hinter dem der Client-PC sitzt, noch an den Rechner weitergeleitet, auf dem der Client läuft, oder nur das erste eingehende Packet? Und wieso?
Ich weiß, dass hört sich seltsam an, doch ich hoffe, ihr versteht meine Frage und könnt diese beantworten. Falls ihr noch Rückfragen habt, so stellt diese doch einfach

SERVER
Code: Alles auswählen
# -*- coding: utf-8 -*-
## Server Test
import socket, time
ip = "" # IP-Adresse
tcp = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcp.bind ((ip, 55555))
tcp.listen (1)
comm, addr = tcp.accept()
path = comm.recv (100)
file = open (path, "rb")
file_content = file.read() # Datei wird ausgelesen
file.close()
comm.send (file_content)
time.sleep (3) # kurze Zeitverzögerung
comm.send ("READY") # Wenn alles abgeschickt wurde, wird dem Client vermittelt, dass der Datentransfer abgeschlossen ist
Code: Alles auswählen
# -*- coding: utf-8 -*-
## Client Test
import socket
ip = "" # IP-Adresse des Servers
comm = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
comm.connect ((ip, 55555))
downloadpath = "/home/username/ieine/mp3datei.mp3"
comm.send (downloadpath)
file = open ("test.mp3", "w") # Datei wird erstellt/bestehende überschrieben
file.close()
while True:
data = comm.recv (50000) # 50000 ist nur eine Beispielgröße
if data != "READY": # Wurden alle Stücke der mp3-Datei gesendet, so sendet der Server 'READY' und das Programm beendet
file = open ("test.mp3", "ab") # Datei wird Stück für Stück vervollständigt
file.write (data)
file.close()
else:
print data
break
py4fun