UDP Server Sockets

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
antaeus
User
Beiträge: 48
Registriert: Dienstag 19. September 2006, 10:10

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!
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.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Richtig, UDP ist verbindungslos und accept() damit witzlos. Schade, dass das nicht in den Docs steht.
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.
antaeus
User
Beiträge: 48
Registriert: Dienstag 19. September 2006, 10:10

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 ;-)
Antworten