Seite 1 von 1

UDP Server Sockets

Verfasst: Donnerstag 5. Oktober 2006, 18:25
von antaeus
Hallo zusammen.

Ich setze mich gerade mit UDP Server Sockets auseinander und bin ein wenig verblüfft, dass ihre Benutzung scheinbar doch recht anders ist, als die von TCP Sockets.

Wenn ich den folgenden Codes ausführe...

Code: Alles auswählen

from socket import *
# Set the socket parameters
host = "localhost"
port = 21567
buf = 1024
addr = (host,port)

# Create socket and bind to address
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)

# Receive messages
while 1:
    (connSock, addr) = UDPSock.accept()
    (data, addr) = connSock.rcv(buf)
    if not data:
        print "Client has exited!"
        break
    else:
        print "\nReceived message '", data,"'"

# Close socket
UDPSock.close()
bekomme ich folgenden Fehler:
Traceback (most recent call last):
File "/home/DrScheme/workspace/test/src/main.py", line 14, in ?
(connSock, addr) = UDPSock.accept()
File "/usr/lib/python2.4/socket.py", line 169, in accept
sock, addr = self._sock.accept()
socket.error: (95, 'Operation not supported')
Scheinbar "mag" der UDP Socket das accept nicht. Googeln brachte mich zu folgendem Beispielcode, der ohne accept auskommt.

Code: Alles auswählen

from socket import *
# Set the socket parameters
host = "localhost"
port = 21567
buf = 1024
addr = (host,port)

# Create socket and bind to address
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)

# Receive messages
while 1:
	(data,addr) = UDPSock.recvfrom(buf)
	if not data:
		print "Client has exited!"
		break
	else:
		print "\nReceived message '", data,"'"

# Close socket
UDPSock.close()
Ich würde aber gerne so etwas wie accept verwenden, damit ich (wie im oberen, nicht funktionierenden Beispiel) einen Socketdeskriptor bekomme, den ich an eine andere Funktion bzw. an ein Objekt weiter geben kann. Geht das gar nicht oder geht das irgendwie anderst?

Danke euch!

Verfasst: Donnerstag 5. Oktober 2006, 22:41
von BlackJack
Was willst Du denn da übergeben? UDP ist verbindungslos, die Daten die Du bekommst sind alles was in dem UDP-Paket enthalten ist, da gibt's keine Verbindung zum Sender.

Verfasst: Freitag 6. Oktober 2006, 10:04
von Y0Gi
Richtig, UDP ist verbindungslos und accept() damit witzlos. Schade, dass das nicht in den Docs steht.

Verfasst: Freitag 6. Oktober 2006, 10:16
von BlackJack
Das `socket` Modul gehört zu den Modulen, die eine recht dünne Schicht über die entsprechenden C Bibliotheken bilden. Da kann/sollte man also jegliche Doku zu Socketprogrammierung in C zu Rate ziehen können.

Das ist ein recht komplexes Thema mit einigen Fallstricken. Ich denke nicht, dass die Modul-Dokumentation hier die Aufgabe übernehmen sollte TCP/UDP etc. zu erklären.

Verfasst: Freitag 6. Oktober 2006, 10:20
von antaeus
Ok, danke für die Antwort. Dass UDP Verbindungslos ist, weiß ich zwar, aber mir war nicht bewusst, dass sich das großartig auf die Programmierung auswirken wird.

Wenn man drüber nachdenkt, ist das aber irgendwie logisch ;-)