2009-05-13 4 views
0

私のLinksysのルータはコンピュータ(PCとMacとLinux)に固定ローカルIPを割り当てていないので、私は毎分コンピュータが互いに更新するようにスクリプトを書いています。192.168.1.102のようなローカルIPアドレスを報告するプログラムの作成方法は?

各マシン上の http://localhost/list.html

は、すべてのPCやMacとそのApacheサーバへのリンク(http://192.168.1.102を指し、など)

は、それがローカルIPアドレスを見つけるための方法のように見えるの名前のリストが含まれますPCではipconfig、MacとLinuxではifconfigであり、プログラムで実行するにはgethostbyname()を使用します。

しかし、私は、Rubyにしようとした、

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 

とIPCONFIGが実際に

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

を示していることので、これはそれを行うには正しい方法は何ですか?私はRubyで "ipconfig"を実行することでそれをハックし、結果を得るために正規表現を使用しますが、より標準的な方法でそれを行うのがいいでしょう。

あなたが使用してJavaでこれを行うことができます

答えて

2

Socket::getaddrinfoは、あなたが探しているもののよりかもしれません:

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

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

それとも、あなただけ試してみてください:

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

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

Rubyスクリプトの問題は、ネットワーク上にDNS名前解決がないことがあります。これは、多くの場合、通常はSMB/CIFSとの間で物事を共有する場合は隠されています。これはそれが自分の名前発見プロトコルだからです。

1

WindowsシステムでBonjourを実行し、Linuxシステムでavahiを実行する場合、各システムのIPアドレスを決定する必要はありません。その後、 "hostname.local"を使用して各システムにアドレスすることができます。詳細情報here

+0

私のnetgearルータは、各コンピュータに固定ローカルIPを割り当てることができます...しかし、私は、より信頼性の高いlinksysルータを見つけました。私の友人は、無線LANのd-linkルーターは高速で信頼性が高く、固定ローカルIPも割り当てることができます。多分私は信頼性のための速度とDSLインターネットのためのケーブルインターネットを使用し、別のルータを購入する場合は、それを検討します。 –

+0

Bonjourでは、ローカルIPを固定する必要はありません。ホストは、マルチキャストDNSを使用してIPアドレスを相互に通知します。 – sigjuice

+0

Bonjourはホームネットワークに最適です。制限やブロッキングのために企業ネットワーク上ではあまり良くありません。 – Joshua

1

これらのマシンのDHCPをオフにして固定IPアドレスを割り当てるだけではどうですか?

コメントの編集編集:少なくとも3年前(私がルータを買った最後の時間)に、Linksysのルータでは、内蔵のDHCPサーバの一番下のIPアドレスを設定することができました。次に、個々のマシンのネットワーク設定に入り、DHCPを無効にして物理アドレスを割り当てます。たとえば、私のホームネットワークでは、ルータは192.168.1.1、Terastationは1.2、プリンタは1.3、私のLinuxボックスは1.99、ルータは1.100以上を提供するように設定されています。

+0

リンクスのルータもそうすることができますか? DHCPを使用することは常にオプションであり、追加の利点はありませんか? –

+0

私のLinksys WRT54Gルータはこれを行うことができます。 – sigjuice

0

/ip inという名前のデータグラムをブロードキャストする場合は、実際に自分のIPアドレスを知るためのPCは必要ありません。その名前を含むデータグラムを送信してからrecvfrom() - またはそれと同等のものを使用して、他のPCでキャッチします。こうすることで、受信者は、recvfrom()機能を介して送信者のIPアドレスを直接抽出できます。

送信PCに複数のネットワークアダプタがある場合には、これが有効です。

関連する問題