2013-06-17 4 views
2

В настоящее время я пишу программу python, которая должна обнаруживать другие экземпляры себя в локальной сети. Он использует UDP-трансляции для обнаружения (255.255.255.255).Отправка широковещательной рассылки во все сети

Проблема в том, что если компьютер имеет несколько сетевых адаптеров (подключен к нескольким сетям), то только одна из этих сетей получит широковещательную передачу. Моя первоначальная идея состояла в том, чтобы перечислить все сетевые адреса, назначенные локальным сетям, и отправить широковещательный пакет для каждого из них (например, 192.168.0.255 и 192.168.1.255). Тем не менее, похоже, нет надежного способа обнаружить все локальные сетевые адреса, как все, что я нашел, и попытался либо полагаться на библиотеку python-2, либо возвращает только 127.0.1.1 на моей виртуальной машине Linux (у которой есть 192.168.0.100 и некоторые другие).

Как я могу транслировать все доступные сети в этом случае?

Я использую Python 3 и ищу платформенно-независимый способ сделать это и без больших сторонних библиотек. Библиотека, которая correctly отображает все сетевые интерфейсы, выполнит эту работу.

+0

Извините, я не знаю ни одной библиотеки Python, которая сделает это за вас. Для чего стоит: в Windows вы можете проанализировать outout 'ipconfig/all', в Linux посмотреть' ip addr' и 'ip link'. –

+1

Худший совет, который вы можете дать. Есть модули, предназначенные для работы. Всегда избегайте запуска внешних команд - это плохая практика. –

+1

Если вы отправляете пакет UDP на '255.255.255.255', его следует отправлять по всем сетевым интерфейсам по умолчанию, хотя, предположительно, [некоторые проблемы] (http://serverfault.com/questions/72112/how-to-alter -the-global-broadcast-address-255-255-255-255-behavior-on-windows) с реализацией в Windows. – Aya

ответ

0

Пробег: nmap. Существует python-nmap здесь https://pypi.python.org/pypi/python-nmap для ваших нужд

Примечания: номер 0.2.7 версии для python-nmap, не Python себя, поэтому он работает в Python3).

+0

Может делать работу, но это похоже на то, чтобы вытащить танк, чтобы убить муху :-) –

+0

Я действительно не хочу выполнять сканирование портов, просто чтобы отправить трансляцию всем доступным сетям. – stormbreaker

0

Интересная проблема. Однако:

  1. До тех пор пока вы не установите приложение на каждом узле, не ожидайте ответа от каждого компьютера в сети. По соображениям безопасности ответ на трансляции запрещен в определенных типах устройств и систем.
  2. Вы можете попробовать следующий код, чтобы получить локальные адреса:

    import socket 
    myips = socket.gethostbyname_ex(socket.gethostname())[2] 
    [ip for ip in myips if not ip.startswith("127.")][:1] 
    

    Проблема с определением набора для сетевой маски, что IP остается.

  3. netifaces модуль доступен на pypi также. Примеры на странице достаточно, чтобы объяснить, как использовать модуль.

+0

Спасибо за ответ. 1. Я знаю, мое приложение будет слушать трансляции и отвечать. Проблема заключается в их отправке. 2. Проблема в том, что этот режим не работает корректно на моей виртуальной машине Linux. Он возвращает только один, не связанный ['127.0.1.1'], хотя iptables правильно показывает 192.168.0.100. 3. netifaces, похоже, является python-2-only lib. – stormbreaker

+0

Я думаю, что код достаточно прост, чтобы исправить его до Python 3. Он использует стандартные системные вызовы внутри. –

+0

Я нашел порт, но он не устанавливается на windows, так как есть код C, который необходимо скомпилировать и т. Д. – stormbreaker

Смежные вопросы