我正在构建一个简单的客户端 - 服务器多人游戏,我希望连接UDP套接字。但是,当我调用listen()
方法时,它会产生Operation not supported
异常。
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
有没有办法连接数据报套接字?
答案 0 :(得分:3)
UDP协议是无连接的,因此您实际上无法以与TCP客户端和服务器相同的方式在2个套接字之间创建连接;因此,您也无法在UDP套接字上执行listen
系统调用,因为它只涉及TCP服务器套接字。而是使用socket.recvfrom
从任何地址接收数据报:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host, port))
data, addr = sock.recvfrom(65536) # this will fit the maximum datagram
您可以通过对addr
host, port
socket.AF_INET
元组socket.SOCK_DGRAM
进行解构来响应客户端(如果他们仍然打开套接字)。< / p>
client_host, client_port = addr
您可以使用sendto
sock.sendto(data, (client_host, client_port))
如果你想使用一个众所周知的端口,你将bind
插座;如果没有,系统将为您分配一个端口。
可以在许多套接字实现上使用数据报套接字进行connect
系统调用;这可以作为一种过滤器,它可以丢弃来自不需要的数据包的数据包,也可以设置sock.send
的默认传出地址(在这样的套接字上使用sock.sendto
到另一个地址仍然可以。由于&#34;连接&#34;)可能会丢弃响应。如果它们同意使用2个众所周知的端口,则在客户端或2个节点之间非常有用。
但是,如果您在服务器上执行connect
,则无法在此套接字上提供任何其他请求。此外,listen
及其队列仅与SOCK_STREAM
套接字相关。
因此,如果有多个客户端到1个服务器,您可以让服务器侦听套接字12345
,当客户端联系服务器时,服务器可以从server:12345
响应包含的消息客户端应该与服务器一起使用的另一个端口号。