Ubuntu上Python UDP服务器无法工作

2 投票
1 回答
1012 浏览
提问于 2025-04-17 03:15

我正在一台运行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)

这样就可以接受来自任何地方的连接了。

撰写回答