LoginSignup
5
3

More than 3 years have passed since last update.

ソケットを使って、DNS、mDNS、WINS、LLMNRでホスト名のIPアドレスを問い合わせる

Posted at

名前の問い合わせ

普通はOSの関数であるgethostbynameまたはgetaddrinfoを使って、ホスト名からIPアドレスを取得しますが、これを自前でやってみます。ソケットとUDP通信の学習用サンプルプログラムとしてご利用いただけます。または、汎用OSが無いワンチップマイコンなどにも応用できるかもしれません。動作環境はLinuxを想定しています。

プログラムとしては、あえて、微妙に未完成な感じにしてあります。4種類のプロトコルは、ソースコード中のコメントアウトしている行を変更して切り替えてください。

ソースコードは、このページの下にあるリンクからどうぞ

DNS

インターネットの名前解決を行います。Domain Name Service の略です。

DNSサーバの UDP/53 へ問い合わせします。サーバアドレスはソースコード中にハードコーディング(8.8.8.8)してあります。

mDNS

macOSで主に使われる名前解決の仕組みで、Multicast DNS の略です。Windows 10では標準でサポートされています。10未満のWindowsでは「Bonjour for Windows」をインストールすると利用できるようになります。Linuxでは Avahi Daemon でサポートされています。

ローカルネットワークの 224.0.0.251 宛に UDP/5353 へマルチキャストして問い合わせします。該当するホストは自分自身で応答パケットを返信します。

WINS

Windowsでかなり昔からある名前解決の仕組みです。Windows Internet Name Service の略、別名NBNS(NetBIOS Name Service)ともいいます。Ubuntu/Debianでは、Sambaまたはlibnss-winbindというパッケージをインストールすると利用できるようになります。ただし、最新の一部ディストリビューションでは、起動スクリプトに問題があるらしく、これを利用するには修正が必要なことがあるらしいです。

ローカルネットーワークで UDP/137 へブロードキャストで問い合わせます。該当するホストは自分自身で応答パケットを返信します。

LLMNR

最近のWindowsでサポートされている名前解決の仕組みで、Link-local Multicast Name Resolution の略です。最近といっても Windows Vista 以降なので、ほとんどのWindows環境で利用できます。ただし、NASなどのハードウェア製品では、WINSは使えてもLLMNRには対応していないことがあります。

ローカルネットワークの 224.0.0.252 宛に UDP/5355 へマルチキャストして問い合わせします。該当するホストは自分自身で応答パケットを返信します。

ソースコード

ビルド用の定義は、筆者が愛用している開発環境 Qt Creator のプロジェクトファイルを用意しましたが、C++のソースファイルが1個だけですので、簡単にコンパイルできると思います。プログラムの開発に当たって、「Geekなぺーじ/UDPパケットのやりとりを行うサンプルプログラム」を参考にさせていただきました。

サーバ側(参考)

ついでですが、問い合わされる側(サーバ)のコードも、昔書いたのがあります。もし興味があればご覧ください。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3