Help us understand the problem. What is going on with this article?

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

名前の問い合わせ

普通は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パケットのやりとりを行うサンプルプログラム」を参考にさせていただきました。

https://github.com/soramimi/nsquery

サーバ側(参考)

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

https://github.com/soramimi/bogons

soramimi_jp
C++とQtが好き。電子工作もやる。第一種情報処理技術者と第二種電気工事士を持ってる。ワンチップマイコンのファームウェアからPCのデスクトップアプリまで。PCより大規模なシステムは守備範囲外。うちの子かわいい(ドール)。40代独身おっさん(´・ω・`)
http://www.soramimi.jp/
AI-medical-service
近未来の内視鏡医療を実現する医療ベンチャー
https://www.ai-ms.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした