我试图使用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
时遇到麻烦,一切都会很好。在
目前没有回答
相关问题 更多 >
编程相关推荐