Python UDP сервер на Ubuntu не работает - PullRequest
2 голосов
/ 28 сентября 2011

Я пытаюсь запустить этот скрипт на коробке с 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? Кто-нибудь знает, что здесь происходит?

Заранее спасибо!


UPDATE:

Вывод скрипта должен выглядеть так:

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 голосов
/ 28 сентября 2011

Ваш код привязывает сервер к localhost, т. Е. Он только прослушивает локальные соединения. Заменить

UDPServer.__init__(self,('localhost', GROWL_UDP_PORT), _RequestHandler)

с

UDPServer.__init__(self,('', GROWL_UDP_PORT), _RequestHandler)

принимать подключения из любого места.

...