名前の問い合わせ
普通は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パケットのやりとりを行うサンプルプログラム」を参考にさせていただきました。
サーバ側(参考)
ついでですが、問い合わされる側(サーバ)のコードも、昔書いたのがあります。もし興味があればご覧ください。