2009-05-13 13 views
0

Da mein Linksys Router den Computern (PC und Mac und Linux) keine feste lokale IP zuweist, möchte ich ein Skript schreiben, so dass die Computer jede Minute aktualisiert werden, so dassWie schreibe ich ein Programm zum Melden der lokalen IP-Adresse wie 192.168.1.102?

http://localhost/list.html

auf jedem Rechner eine Liste der Namen aller PC und Mac und einen Link zu ihrem apache-Server (zeigt auf http://192.168.1.102, usw.) enthalten

es wie eine Art und Weise sieht Adresse die lokale IP, um herauszufinden, ist von ipconfig auf dem PC, und ifconfig auf dem Mac und Linux, und es programmgesteuert zu tun, wird es gethostbyname() sein.

Aber ich versuchte, auf Rubin, dass

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 

und ipconfig zeigt tatsächlich

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

so ist dies der richtige Weg, es zu tun? Ich kann es hacken, indem ich "ipconfig" in Ruby ausführe und reguläre Ausdrücke verwende, um das Ergebnis zu erhalten, aber es wäre schön, es mit einer Standardmethode zu machen.

Antwort

2

Socket::getaddrinfo sein könnte mehr von dem, was Sie suchen:

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

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

Oder können Sie nur versuchen:

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

Sie können dies in Java tun mit:

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

Das Problem im Ruby-Skript könnte sein, dass es in Ihrem Netzwerk keine DNS-Namensauflösung gibt, dies ist oft der Fall ausgeblendet, wenn Sie normalerweise Daten zwischen Computern mit SMB/CIFS teilen, da dies ein eigenes Protokoll zur Namensfindung hat.

1

Wenn Sie Bonjour auf Ihren Windows-Systemen und Avahi auf Ihren Linux-Systemen ausführen, können Sie die IP-Adresse jedes Systems ermitteln. Sie können dann jedes System einfach mit "hostname.local" adressieren. Weitere Informationen here.

+0

mein Netgear Router könnte jedem Computer eine feste lokale IP zuweisen ... aber ich fand den Linksys Router zuverlässiger. mein freund hat mir gesagt, dass sein d-link router mit wireless-n schnell und zuverlässig ist und auch feste lokale IP zuweisen kann. vielleicht werde ich darüber nachdenken, wenn ich Kabel-Internet für die Geschwindigkeit und dann DSL-Internet für Zuverlässigkeit verwende und einen anderen Router kaufe. –

+0

Mit Bonjour müssen Sie keine festen lokalen IPs haben. Die Hosts teilen sich ihre IP-Adressen mithilfe von Multicast-DNS mit. – sigjuice

+0

Bonjour ist ideal für Heimnetzwerke. Nicht so gut in Unternehmensnetzwerken aufgrund von Einschränkungen und Blockierung. – Joshua

1

Warum nicht einfach DHCP für diese Maschinen ausschalten und ihnen feste IP-Adressen zuweisen?

Bearbeite als Antwort auf die Kommentare: Mindestens als vor drei Jahren (letztes Mal kaufte ich einen Router), Linksys Router erlaubt Ihnen, die untere IP-Adresse für den integrierten DHCP-Server. Dann gehen Sie in das Netzwerk-Setup der einzelnen Maschinen, deaktivieren DHCP und vergeben physische Adressen. In meinem Heimnetzwerk ist der Router beispielsweise 192.168.1.1, die Terstation ist 1.2, der Drucker ist 1.3, meine Linux-Box ist 1.99 und der Router ist so konfiguriert, dass er 1.100 und höher ausgibt.

+0

kann ein Linksys-Router das auch? DHCP ist also immer optional und hat keinen zusätzlichen Nutzen? –

+0

Mein Linksys WRT54G Router kann dies tun. – sigjuice

0

Wenn Sie Datagramme mit dem Namen/IP-Info senden, brauchen Sie nicht wirklich einen PC, um seine eigene IP-Adresse zu kennen. Senden Sie einfach das Datagramm, das seinen Namen enthält, und verwenden Sie dann recvfrom() - oder Äquivalente -, um es an den anderen PCs abzufangen. Auf diese Weise können die Empfänger die IP-Adresse des Absenders direkt über die Funktion recvfrom() extrahieren.

Als Bonus sollte das funktionieren, wo der sendende PC mehr als einen Netzwerkadapter hat.