InetAddress.getLocalHost()はDNSを参照する

Share on:

先日プログラミング2のコード例としてサーバ・クライアント型のチャットを紹介するも、接続できずに撃沈!残念!

事前に動作確認済みだったんですが、そことの違いはネットワーク接続方法。成功してたのはWi-Fi接続時で、失敗時は有線LAN接続。ネットワーク側の問題かなと思いきや、そうではないとの回答。

PC外の問題じゃないならこっちの問題かということで物理層から確認していくと、なんと、実際に割り振られているIPアドレスとInetAddress.getLocalHost()が取得するものが違っている。ifconfigで見えるものは複数あるけど、どれとも違う。ググる限りではloopback取得してる例が頻出するけどもそうじゃなくて全く無関係に見える異なるアドレス。

ナンジャコリャとデバッガで追いかけてみると、、、

1//InetAddress.class
21499: localAddrs = InetAddress.getAddressesFromNameService(local, null);
31509: cachedLocalHost = localAddrs[0];
41511: ret = localAddrs[0];

こんな感じでアドレス取得してるらしい。え、localHostのアドレス取得するのにいちいち NameService さん(DNS?)に聞きに行ってるの!?

ここでふと思い出したのが有線LANの設定。MACアドレスベースで登録してたよなと確認してみると、いくつかの事情が絡み合って今の状況を作っていることが発覚。

  • 事情1: MACアドレスだけじゃなく、ホスト名を指定して登録されている。(旧MACアドレス, 旧ホスト名とする)
  • 事情2: 2020年度からPC変わった。(MACアドレスも変わってる)
  • 事情3: 新しいMACアドレスも登録した。このときのホスト名は変えている。(新MACアドレス、新ホスト名とする)
  • 事情4: PCでは旧ホスト名が残っている。具体的にはmacBookの共有設定にあるコンピュータ名(=hostname)が旧ホスト名になっている。
  • 事情5: 事情1〜事情4はローカルDNSでの話。
  • 事情6: Wi-Fiは諸事情あって8.8.8.8を指定していたのを忘れていた。有線LANはローカルDNS参照。

この状況だと、getAddressesFromNameService で旧ホスト名が取得され、旧ホスト名のアドレスをDNSで正引きすることでIPアドレス取得することになるらしい。元々の話に戻ると、Wi-Fiと有線LANとで動作が変わったのはDNSが変わっていたから。

というのは言い訳で、ホスト名を古いまま使ってたのがダメという話ですね。ごめんなさい。