Question

depuis mon routeur Linksys ne pas attribuer une adresse IP locale fixe aux ordinateurs (PC et Mac et Linux), je voudrais écrire un script afin que chaque minute, les ordinateurs mettra à jour à l'autre de sorte que

http: //localhost/list.html

sur chaque machine contient une liste des noms de tous les PC et Mac et un lien vers leur serveur apache (pointant vers http: / /192.168.1.102 , etc)

il ressemble à une façon de trouver l'adresse IP locale est par ipconfig sur PC, et ifconfig sur le Mac et Linux, et de le faire par programme, il sera gethostbyname ().

Mais j'ai essayé sur Ruby, que

irb(main):001:0> require 'socket'
=> true

irb(main):002:0> p Socket::gethostbyname("localhost")
["Core2Duo", [], 2, "\177\000\000\001"]

irb(main):005:0> p Socket::gethostbyname("core2duo")
["Core2Duo", [], 2, "\300\250\001g"]
=> nil

et ipconfig en fait montre

IPv4 Address. . . . . . . . . . . : 192.168.1.103

est-ce la bonne façon de le faire? Je peux le pirater en exécutant « ipconfig » dans Ruby et d'utiliser l'expression régulière pour obtenir le résultat, mais serait bien de le faire en utilisant de façon plus standard.

Était-ce utile?

La solution

Socket::getaddrinfo peut-être plus de ce que vous cherchez:

Socket::getaddrinfo('localhost', 'http')
[["AF_INET", 80, "localhost", "127.0.0.1", ...]]

Socket::getaddrinfo('core2duo', 'http')
[["AF_INET", 80, "Core2Duo", "192.168.1.103", ...]]

Ou, vous pourriez essayer:

Socket::getaddrinfo('core2duo', 'http')[0][3]
"192.168.1.103"

Autres conseils

Vous pouvez le faire en Java en utilisant:

Socket s = new Socket();
s.getLocalSocketAddress();

Si vous exécutez Bonjour sur vos systèmes Windows et Avahi sur vos systèmes Linux, vous pouvez faire disparaître la nécessité de déterminer l'adresse IP de chaque système. Vous pouvez ensuite traiter simplement chaque système en utilisant « hostname.local ». Plus d'infos .

Pourquoi ne pas simplement désactiver le DHCP pour les machines et les attribuer des adresses IP fixes?

Modifier en réponse aux commentaires: Au moins-trois ans ou il y a donc (la dernière fois que j'ai acheté un routeur), les routeurs Linksys vous a permis de définir l'adresse IP en bas pour le serveur DHCP intégré. Ensuite, vous allez dans la configuration du réseau de machines individuelles, désactiver DHCP et attribuer des adresses physiques. Par exemple, sur mon réseau domestique le routeur est 192.168.1.1, la TeraStation est 1.2, l'imprimante est 1.3, ma boîte Linux est 1,99, et le routeur est configuré pour donner 1,100 et au-dessus.

Le problème dans le script Ruby pourrait être qu'il n'y a pas de résolution de nom DNS sur votre réseau, ce qui est souvent caché si vous partagez habituellement des choses entre les ordinateurs avec SMB / CIFS parce que elle a son propre protocole de découverte de nom.

Si vous allez diffuser datagrammes avec le nom / informations ip, alors vous ne vraiment pas besoin d'un PC pour connaître sa propre adresse IP. Il suffit d'envoyer le datagramme contenant son nom, puis utilisez recvfrom () - ou équivalent - pour attraper les autres PC. De cette façon, les récepteurs peuvent extraire l'adresse IP de l'expéditeur directement via le recvfrom () fonction.

En prime, qui devrait fonctionner où le PC a envoyer plus d'un adaptateur réseau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top