Ubuntu上Python UDP服务器无法工作
我正在一台运行Ubuntu 11.04的电脑上运行这个脚本:http://taoofmac.com/space/projects/ReGrowl
这个小脚本是绑定在UDP端口9887上,用来转发Growl数据包的。
我可以从本地机器发送Growl数据包,效果完全符合预期。
但是,当我尝试从网络上的另一台机器发送数据包时,它们似乎被丢弃了,或者没有到达脚本。
我已经配置了Ubuntu以允许这个端口,netstat的输出看起来是这样的:
root@UbuntuVM:~# netstat -a | grep "udp"
udp 0 0 localhost:9887 *:*
udp 768 0 *:mdns *:*
udp 0 0 *:mdns *:*
udp 0 0 *:45030 *:*
udp6 0 0 [::]:44730 [::]:*
udp6 0 0 [::]:mdns [::]:*
我的脚本在列表中的第一项。
我使用了Wireshark确认Ubuntu机器确实收到了数据包。
我需要在Ubuntu上做些什么,以允许Python绑定到UDP端口吗?有没有人知道这是怎么回事?
提前谢谢大家!
更新:
脚本的输出应该是这样的:
127.0.0.1 - - [28/Sep/2011 12:30:27] REGISTER Network Responder 56 ['192.168.0.24', '192.168.0.140', '192.168.0.11', '192.168.0.25', '192.168.0.18', '192.168.0.28', '192.168.0.10', '192.168.0.30']
127.0.0.1 - - [28/Sep/2011 12:30:27] NOTIFY ('Network Status', 'Connection Status', 'Test', 'Network Responder') 80 ['192.168.0.24', '192.168.0.140', '192.168.0.11', '192.168.0.25', '192.168.0.18', '192.168.0.28', '192.168.0.10', '192.168.0.30']
第一个IP是数据包的来源,最后的IP数组是数据包要转发到的目的地。正如你所看到的,这个数据包是从本地机器发出的,如果我从另一台机器发送数据包,它的IP应该会出现在最前面。
这是实现UDP服务器的脚本部分:
class GrowlRelay(UDPServer):
"""Growl Notification Relay"""
allow_reuse_address = True
def __init__(self, inpassword = None, outpassword = None):
"""Initializes the relay and launches the resolver thread"""
self.inpassword = inpassword
self.outpassword = outpassword
self.resolver = RendezvousWatcher()
self.resolver.start()
UDPServer.__init__(self,('localhost', GROWL_UDP_PORT), _RequestHandler)
def server_close(self):
self.resolver.shutdown()
完整的脚本和相关类可以在上面的链接中找到。
1 个回答
3
你的代码把服务器绑定到了本地,也就是说它只接受来自本机的连接。把
UDPServer.__init__(self,('localhost', GROWL_UDP_PORT), _RequestHandler)
替换成
UDPServer.__init__(self,('', GROWL_UDP_PORT), _RequestHandler)
这样就可以接受来自任何地方的连接了。