Python连接数据报套接字

时间:2015-02-21 18:57:21

标签: python sockets python-2.7 udp

我正在构建一个简单的客户端 - 服务器多人游戏,我希望连接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

有没有办法连接数据报套接字?

1 个答案:

答案 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响应包含的消息客户端应该与服务器一起使用的另一个端口号。