0

私の Linksys ルーターはコンピューター (PC と Mac と Linux) に固定のローカル 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」を実行して正規表現を使用して結果を取得することでハッキングできますが、より標準的な方法を使用して行うとよいでしょう。

4

6 に答える 6

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"
于 2009-05-13T17:54:14.963 に答える
1

これは、Javaで次を使用して実行できます。

Socket s = new Socket();
s.getLocalSocketAddress();
于 2009-05-13T17:50:01.490 に答える
1

Windows システムで Bonjour を実行し、Linux システムで avahi を実行すると、各システムの IP アドレスを特定する必要がなくなります。その後、" " を使用して各システムを簡単にアドレス指定できますhostname.local。詳細はこちら

于 2009-05-13T18:03:25.243 に答える
1

これらのマシンの DHCP をオフにして、固定 IP アドレスを割り当ててみませんか?

コメントに応じて編集: 少なくとも 3 年前 (最後にルーターを購入したとき) の時点で、Linksys ルーターを使用すると、組み込みの DHCP サーバーの下部 IP アドレスを設定できました。次に、個々のマシンのネットワーク設定に入り、DHCP を無効にして、物理アドレスを割り当てます。たとえば、私のホーム ネットワークでは、ルーターは 192.168.1.1、Terastation は 1.2、プリンターは 1.3、Linux ボックスは 1.99、ルーターは 1.100 以上を出力するように構成されています。

于 2009-05-13T18:17:26.080 に答える
0

名前/IP 情報を含むデータグラムをブロードキャストする場合、PC が自身の IP アドレスを知る必要はありません。その名前を含むデータグラムを送信し、recvfrom()または同等のものを使用して、他の PC でそれをキャッチします。そうすれば、受信者はrecvfrom()関数を介して送信者の IP アドレスを直接抽出できます。

おまけとして、送信側の PC に複数のネットワーク アダプターがある場合に動作するはずです。

于 2009-05-13T18:36:30.010 に答える
0

Ruby スクリプトの問題は、ネットワーク上に DNS の名前解決がないことかもしれません。SMB/CIFS を使用してコンピュータ間で情報を共有している場合、SMB/CIFS には独自の名前検出プロトコルがあるため、これはしばしば隠されます。

于 2009-05-13T17:55:43.510 に答える