192.168.1.102 などのローカル IP アドレスを報告するプログラムを作成するにはどうすればよいですか?
-
21-08-2019 - |
質問
私の Linksys ルーターはコンピューター (PC、Mac、Linux) に固定ローカル IP を割り当てないため、コンピューターが 1 分ごとに相互に更新されるようにスクリプトを作成したいと考えています。
各マシンには、すべての 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」を実行し、正規表現を使用して結果を取得することでハッキングできますが、より標準的な方法を使用して実行することをお勧めします。
解決
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"
他のヒント
あなたが使用してJavaでこれを行うことができます:
Socket s = new Socket();
s.getLocalSocketAddress();
あなたのLinuxシステム上でWindowsのシステムとのavahi上のBonjourを実行した場合、あなたは離れて、各システムのIPアドレスを決定する必要があると行うことができます。あなたは、単に「hostname.local
」を使用して、各システムに対処することができます。詳細情報ここを。
なぜ、それらのマシンのためにDHCPをオフにし、それらの固定IPアドレスを割り当てない?
コメントへの応答では、編集:少なくともとして-の3年ほど前(私はルータを買って最後の時間)、Linksysのルータを使用すると、内蔵のDHCPサーバーの下のIPアドレスを設定することができました。次に、DHCPを無効にし、個々のマシンのネットワーク設定に移動し、物理アドレスを割り当てます。私のホームネットワーク上のルータが192.168.1.1であるたとえば、TeraStationのは1.2で、プリンタが1.3である、私のLinuxボックスは1.99であり、ルータが1.100以上を与えるように構成されてます。
Rubyスクリプトに問題があなたのネットワーク上にDNSの名前解決がないことかもしれないそれはそれ自身の名前を発見プロトコルを持っているので、あなたは通常、SMB / CIFSとコンピュータ間でのものを共有している場合、これはしばしば隠されています。
名前/IP 情報を使用してデータグラムをブロードキャストする場合、PC が自身の IP アドレスを知っている必要はありません。その名前を含むデータグラムを送信して、次を使用します。 recvfrom() - または同等のもの - 他の PC でそれをキャッチします。そうすることで、受信者は送信者の IP アドレスを直接抽出できます。 recvfrom() 関数。
おまけに、送信側 PC に複数のネットワーク アダプターがある場合でも機能するはずです。