Ich habe eine Frage zur Client / Server Programmierung mit UDP Sockets.
In TCP ist es ja so, dass ich vom Serversocket (SS) nach accept() einen Socketdeskriptor für einen Clientsocket (CS) erhalten. Das ist völlig problemlos und ich kann senden und empfangen wie es mir beliebt.
Bei UDP ist alles ein wenig anderst, da ich ein verbindungsloses Protokoll habe. Es gibt weder listen noch accept; Dafür gibt es recvfrom, was mir Daten und Absenderadresse/Port liefert. Für mich stellt sich jetzt die Frage: wie kriege ich eine Antwort vom Server zurück zum Client gesendet?
Idee 1: Ich verwende den SS und connecte den zur Zieladresse meiner Antwort-Daten, also etwa so:
Code: Alles auswählen
serversocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serversocket.bind(("192.168.0.21", 80))
(data, addr) = serversocket.recvfrom(1024)
serversocket.connect(addr)
serversocket.send("Echo: " + data)
Code: Alles auswählen
def loop(self):
while True:
serversocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serversocket.bind(("192.168.0.21", 80))
(data, addr) = serversocket.recvfrom(1024)
if not data:
pass
else:
print data
serversocket.connect(addr)
serversocket.send("Echo: " + data)
serversocket.close()
Client --> Server: Source Port: x, Destination Port: 80
Server --> Client: Source Port: 80, Destination Port: x
Idee 2: Ich erstelle pro Reqeust einen neuen CS (lasse den SS also unangetastet) und schicke über den CS die Antwort an den Client (siehe loop2()), also etwa so:
Code: Alles auswählen
def loop2(self):
serversocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serversocket.bind(("192.168.0.21", self.port))
while True:
(data, addr) = serversocket.recvfrom(1024)
if not data:
pass
else:
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
clientsocket.connect(addr)
clientsocket.send(data)
clientsocket.close()
Client --> Server: Source Port: x, Destination Port: 80
Server --> Client: Source Port: y, Destination Port: x
Der Unterschied zu Version 1 ist, dass der neue neue CS des Servers nicht mehr von Port 80 sendet, sondern von *irgendeinem* Port y. Der Client scheint aber fest davon auszugehen, dass Port 80 verwendet wird. Jetzt habe ich aber ein Problem, weil ich den CS des Servers nicht an Port 80 binden kann, weil dort ja schon der SS gebunden ist.
Bleibt also nur
Idee 3: Sowohl Server als auch Client verfügen über jeweils einen CS und SS. Der Client sendet an den SS (Port 80) des Servers den Request; der Server sendet seine Response an den SS (z.B. Port 81) des Clients. Das erscheint mir allerdings auch etwas hahnebüchen

Meine Frage ist also ganz konkret, wie sieht "saubere" Client / Server Programmierung mit UDP aus? Die ganzen Tutorials, die ich bisher im Web gefunden habe, zielen alle auf TCP - nutzen mir also nichts. Ich wäre euch sehr dankbar für Hilfe. Vielleicht mache ich oben auch irgendetwas falsch...!?
A.