Моя цель — узнать IP-адрес «сервера» компьютера с 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 "", line 1, in
socket.gaierror: [Errno 11001] getaddrinfo failed