Comment puis-je trouver l'adresse IP d'un hôte à l'aide de mdns?
Mon objectif est de faire découvrir l'adresse IP d'un ordinateur Linux "server" dans le réseau local à partir d'un ordinateur Windows. À partir d'un autre ordinateur sous Linux "client" je peux le faire:
ping -c1 server.local
et d'obtenir une réponse. Les deux "serveur" et "client" exécuter Avahi, donc c'est facile. Cependant, je voudrais découvrir l'adresse IP de "serveur" à partir d'une application en Python de la mine, qui fonctionne sur MS Windows et Linux. Remarque: sur MS Windows ordinateurs ne pas exécuter mDNS logiciel, il n'y a pas de résolution de nom d'hôte (et évidemment ping
ne fonctionne pas sur les systèmes Windows).
Je connais l'existence de pyzeroconf, et c'est le module que j'ai essayé de l'utiliser; toutefois, la documentation est rare et pas très utile pour moi. En utilisant des outils comme avahi-discover
, j'ai pensé que les ordinateurs de publier les enregistrements du type de service _workstation._tcp.local.
(avec évidemment le mannequin port 9, les rejets de service) de mDNS type PTR
qui pourrait être l'équivalent d'un DNS UN enregistrement. Ou j'ai peut-être mal compris complètement le mDNS mécanisme.
Comment connaître l'adresse IP d'un ordinateur (ou d'obtenir une liste des adresses IP des ordinateurs) par le biais de mDNS de Python?
CLARIFICATION (basé sur un commentaire)
L'évidence socket.gethostbyname
fonctionne sur un ordinateur exécutant et configuré pour utiliser le mDNS logiciel (comme 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'
Cependant, sur les ordinateurs Windows exécute pas mDNS logiciel (par défaut), j'obtiens:
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
- Puisque vous pouvez faire un ping sur le serveur à l'aide d'un nom d'hôte, pourquoi ne pas simplement utiliser le normal résolution de nom d'hôte? Comme
socket.gethostbyname
- Parce que normal de résolution de nom d'hôte pour un mDNS-document publié sur un ordinateur Windows s'exécute pas
bonjour
oumdnsresponder
ou que ce soit ne fonctionne pas. - Vous voulez être en mesure de le faire sans une dépendance sur Bonjour pour Windows?
- ... Vous voulez écrire un mDNS démon en Python? Vous êtes mieux de simplement les jeter dans Avahi.
- Super, donc je vais me jeter dans Avahi pour Windows. Non, attendez. Et dans tous les cas, les ordinateurs Windows ont déjà Python, mais je ne peux pas installer d'autres logiciels. Je pense que je serais mieux si j'ai utilisé
pyzeroconf
dans mon cas précis (c'EST un mDNS démon, après tout); j'ai juste besoin de la documentation utile pour elle.
Vous devez vous connecter pour publier un commentaire.
Dans le cas où quelqu'un s'est toujours intéressée au de ce, la tâche peut être réalisée, sur Windows et Linux, en utilisant dnspython comme suit:
Ce code fonctionne lorsque l'ordinateur cible exécute avahi, mais échoue lorsque la cible s'exécute python zeroconf ou l'esp8266 mdns mise en œuvre. Il est intéressant de noter les systèmes Linux exécutant avahi réussi à résoudre ces cibles (avahi apparemment la mise en œuvre de nssswitch.conf mdns plugin et être une meilleure mise en œuvre de la mdns protocole)
Dans le cas d'un naïf mdns répondeur qui, contrairement à la rfc, envoie sa réponse via le mdns port, le code suivant (à exécuter sur linux et windows et la résolution linux avahi, imprimante hp et esp8266 cibles) fonctionne pour moi: (et qui est aussi non conforme, car il utilise la MDNS port pour envoyer la requête alors qu'il est évidemment PAS une mise en œuvre intégrale)
Le vide dns objet a été créé dans le code ci-dessus en passant par le constructeur d'une chaîne collectées à partir du réseau à l'aide de
Cette requête a été produit par nslookup de sorte que son identité a été différente de zéro (dans ce cas, \xf6\xe8) en essayant de résoudre esp01.locaux. Un dns objet contenant une requête vide a ensuite été créé par:
Le même résultat pourrait aussi être créé par:
Le dns de l'objet peut aussi être créé avec les non-vide requête:
ou même avec plusieurs requêtes:
mais un minimum les intervenants peuvent échouer pour gérer les dns des messages contenant plusieurs requêtes
Je suis aussi malheureux avec le python zeroconf de la documentation. De par une simple lecture du code et des paquets de surveillance à l'aide de tcpdump, il semble que (lors de l'enregistrement exemple est en cours d'exécution) zeroconf permettra de répondre pour répondre aux questions, mais nslookup ne tient pas compte (ou ne reçoivent pas) la réponse.
_arduino._tcp.local.
le problème est que j'ai besoin d'exécuter le code d'un sublime texte plugin j'ai donc besoin d'un code aussi petite que possible et de les exécuter sans trop de dépendances. Dans le cas de zeroconf netifaces est écrit en C et je ne pouvais pas le faire fonctionner, à ST. Pouvez-vous me dire si c'est possible de le faire avec vous le code? J'ai essayé avec:for host in ['arduino','_arduino'][::-1]:
mais je n'ai aucun résultatÀ respecter à la lettre de la question initiale, la réponse est oui. Objectifs de l'exécution de avahi peut être découvert avec python zeroconf à condition qu'ils font la publicité de certains services. Par défaut, le avahi-daemon de la publicité de l'_workstation.tcp.local service. Dans le but de découvrir de tels serveurs de modifier la browser.py exemple à venir avec zeroconf, de sorte qu'il ressemble à ce service (ou de tout autre service annoncé par les objectifs d'intérêt) au lieu de (ou en plus) _http.tcp.locaux. browser.py découvrirez également des cibles à l'aide de zeroconf est registration.py exemple pour la publicité de leurs services, mais pas esp8266 cibles (esp8266 répond avec un message incorrect TXT (16) de la requête).
Mais pour être honnête, je ne voudrais pas utiliser zeroconf pour cela.
Si vous pouvez tester le système, pourquoi ne pas utiliser les sous-processus, de rediriger la sortie vers un fichier, lire le fichier et le tour est joué! Voici un croquis:
REMARQUE: Dans mon cas, l'ip 127.0.0.1, mais c'est parce que j'ai utilisé localhost. Aussi, vous pouvez faire le ping nombre 1, mais je l'ai fait 5 juste au cas où il y avait des problèmes de réseau. Vous devez être plus intelligent sur la façon dont vous analysez le fichier. Pour cela, vous pouvez utiliser le module re.
De toute façon, la méthode décrite ici est brut, mais il devrait fonctionner si vous connaissez le nom du système que vous souhaitez exécuter la commande ping.
ping hostname
ne fonctionne pas sur un ordinateur Windows s'exécute pas mDNS logiciel, sinon je vais avoir plus de réponses semblables. Merci de prendre le temps de répondre, de toute façon.