Domanda

dal momento che il mio router Linksys non assegnare un IP locale fisso per i computer (PC e Mac e Linux), mi piacerebbe scrivere uno script in modo che ogni minuto, i computer aggiornerà gli uni agli altri in modo che

http: //localhost/list.html

su ogni macchina conterrà un elenco di nomi di tutti i PC e Mac e un link al loro server apache (indicando http: / /192.168.1.102 , etc)

appare come un modo per scoprire l'indirizzo IP locale è da ipconfig su PC, e ifconfig su Mac e Linux, e di farlo a livello di codice, sarà gethostbyname ().

Ma ho provato su Ruby, che

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

e ipconfig realtà spettacoli

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

quindi è questo il modo giusto per farlo? Posso hack eseguendo "ipconfig" in Ruby e utilizzare espressioni regolari per ottenere il risultato, ma sarebbe bello farlo utilizzando un modo più standard.

È stato utile?

Soluzione

Socket::getaddrinfo potrebbe essere più di quello che stai cercando:

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

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

In alternativa, si potrebbe anche provare:

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

Altri suggerimenti

È possibile farlo in Java utilizzando:

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

Se si esegue Bonjour sui vostri sistemi e avahi di Windows sui sistemi Linux, è possibile farla finita con la necessità di determinare l'indirizzo IP di ogni sistema. Si può poi semplicemente affrontare ogni sistema usando "hostname.local". Maggiori informazioni qui .

Perché non basta spegnere DHCP per quelle macchine e assegnare loro indirizzi IP fissi?

Modifica in risposta ai commenti: Almeno come-di tre anni or sono (l'ultima volta ho comprato un router), i router Linksys ha permesso di impostare l'indirizzo IP di fondo per il built-in server DHCP. Poi, si va in configurazione di rete delle singole macchine, disabilita DHCP, e assegnare indirizzi fisici. Per esempio, sulla mia rete domestica il router è 192.168.1.1, la TeraStation è 1.2, la stampante è di 1,3, la mia macchina Linux è 1.99 e il router è configurato per dare 1.100 e sopra.

Il problema nello script di Ruby potrebbe essere che non v'è alcuna risoluzione dei nomi DNS sulla rete, questo è spesso nascosto se di solito condividono roba tra i computer con SMB / CIFS, perché questo ha il proprio protocollo di individuazione del nome.

Se avete intenzione di essere trasmettere datagrammi con il nome / info ip in, allora non si ha realmente bisogno di un PC di conoscere il proprio indirizzo IP. Basta inviare il datagramma contenente il nome, quindi utilizzare recvfrom () - o equivalenti - di prenderlo in altri PC. In questo modo i ricevitori in grado di estrarre l'indirizzo IP del mittente direttamente tramite il la funzione recvfrom ().

Come bonus, che dovrebbe funzionare in cui il PC di invio ha più di una scheda di rete.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top