Моя цель - открыть IP-адрес сервера "Linux" Linux в локальной сети с компьютера Windows. С другого "клиентского" компьютера Linux я могу сделать:
ping -c1 server.local
и получите ответ. И "сервер", и "клиент" запускают Avahi, так что это легко. Однако я хотел бы узнать IP-адрес "сервера" из моего приложения Python, которое работает как на компьютерах MS Windows, так и на Linux. Примечание: на компьютерах MS Windows, которые не работают, запускают программное обеспечение mDNS, нет разрешения имени хоста (и, очевидно, ping
не работает в указанных системах Windows).
Я знаю о существовании pyzeroconf, и это модуль, который я пытался использовать; однако документации недостаточно и не очень полезно для меня. Используя такие инструменты, как avahi-discover
, я решил, что компьютеры публикуют записи типа службы _workstation._tcp.local.
(с явно фиктивным портом 9, службой сброса) типа mDNS PTR
, который может быть эквивалентом записи DNS A. Или я, возможно, неправильно понял механизм mDNS.
Как узнать IP-адрес компьютера (или получить список IP-адресов компьютеров) через mDNS из Python?
ПОДТВЕРЖДЕНИЕ (на основе комментария)
Очевидный socket.gethostbyname
работает на компьютере, который работает и настроен на использование программного обеспечения mDNS (например, Avahi):
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.gethostbyname('server.local')
'192.168.42.42'
Однако на компьютерах Windows, на которых не запущено программное обеспечение mDNS (по умолчанию), я получаю:
Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.gethostbyname('server.local')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
socket.gaierror: [Errno 11001] getaddrinfo failed