Reputation: 4002
I'm building a simple client-server multiplayer game and I want to have connected UDP sockets. However, when I call the listen()
method it produces Operation not supported
exception.
try:
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind((host, port))
server.listen(5)
except socket.error, (value, message):
print "E: " + message # E: Operation not supported
Is there a way to have connected datagram sockets?
Upvotes: 2
Views: 3036
Reputation: 133978
UDP protocol is connectionless and thus you really cannot create connections between 2 sockets in the same manner as with the TCP client and server; thus you also cannot do the listen
system call on an UDP socket, as it concerns only the TCP server sockets. Instead you use socket.recvfrom
to receive datagrams from any address:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host, port))
data, addr = sock.recvfrom(65536) # this will fit the maximum datagram
You can respond to the client (if they still have a socket open), by destructuring the addr
which is a host, port
tuple for socket.AF_INET
, socket.SOCK_DGRAM
.
client_host, client_port = addr
You can send data back there with sendto
sock.sendto(data, (client_host, client_port))
If you want to use a well-known port, you will bind
the socket; if not, the system will assign a port for you.
It is possible to do a connect
system call with datagram sockets on many socket implementations; this serves as a sort of filter, that drops the packets coming from unwanted sources, and for setting the default outgoing address for sock.send
(it is still OK to use sock.sendto
on such socket to another address, though the response might be dropped because of the "connection"). This is very useable on a client or between 2 nodes if they agree to use 2 well known ports with each other.
However if you do connect
on server, it cannot serve any other requests on this socket. Also, listen
with its queues only relates to SOCK_STREAM
sockets.
Thus in case of many clients to 1 server, you could have the server listen to socket 12345
, and when a client contacts the server, the server could respond from server:12345
with a message that contains another port number that the client should use with the server.
Upvotes: 4