Windows上的Python选择

2024-04-29 10:34:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用select监听多个UDP套接字上的数据,但我只能在绑定到特定地址时接收数据。在

我的接收器是这样的:

import socket
import select

def create_socket(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(('0.0.0.0', port))
    return sock

if __name__ == "__main__":
    sockets = [ ]
    sockets.append(create_socket(12345))
    sockets.append(create_socket(12346))
    print 'Waiting for data...'
    while True:
        readable, _, exceptional = select.select(sockets, [ ], sockets)
        print 'SELECT RETURNED!!'
        for sock in readable:
            # recvfrom socket, etc...
        for sock in exceptional:
            print 'Error with', sock
            sockets.remove(sock)
            sock.close()

我用一个交互式Python控制台来测试:

^{pr2}$

当我这样做时,select在发送数据时不会返回(尝试了localhost和我的公共IP)。在

如果我将create_socket更改为绑定到localhost,那么当我向localhost发送数据时,select将成功返回。当我绑定到我的公共IP并将数据发送到该IP时,它也可以工作。在

这是Windows7上的Python2.7。在

我是做错了什么,还是Windows上的select模块有什么限制?如果我创建一个绑定到0.0.0.0的单一套接字并做一个简单的recvfrom我只在使用select时遇到麻烦,一切都会很好。在


Tags: 数据importiplocalhostforportcreatesocket