前回までうさちゃんRabbit4000自身を調査。今回から再びうさちゃんを使役してネットワークのロウレベルなところを直接触っていきたいとおもいます。DNS(Domain Name System)から。Raspberry Pi 4上のDNSサーバに向かってうさちゃんからQueryを投げ、ラズパイからお返事してもらうと。
※「うさちゃんと一緒」投稿順 Index はこちら
※Rabbitシリーズのマニュアルは、販売元のDigi社のページからダウンロードできます。
※実験には、Rabbit4000搭載のRCM4010モジュールを使用しています。ソフトウエアはDynamic C 10.72でコンパイルしています。
DNSクライアント、サンプルプログラム
前回まで、うさちゃんRabbit4000のZ80魔改造ぶりを堪能?してきましたが、再びネットワークねたに戻ってまいりました。久しぶりにDynamic Cのサンプル・フォルダを漁ってみるとDNSクライアント用に2つソースがあるのを見つけました。
-
- ブロッキング・スタイルのDNSリゾルバ
- ノンブロッキング・スタイルのDNSリゾルバ
1は、ブロッキングなので、DNSクエリをDNSサーバに投げつけると、サーバからの結果が返ってくるか、タイムアウトで失敗するまで待ち続けます。2は、ノン・ブロッキングなので、クエリを投げた後、別な仕事をしながらクエリが解決されるのを待つものです。1の方が「昔のバージョン」からあるプリミティブなスタイルで、2は比較的後から追加されたみたいです。当然1の方が簡単なので、初回の今回は1の方から実験してみたいと思います。サンプル・ファイル名は、
DNC.C
なんと直接的な。
ごく短いプログラムです。修正点は以下のとおり。例によって、うさちゃん自身のIPアドレス、ネットマスク、ゲートウエイのIPアドレス、そしてNAMESERVERのアドレスの設定を追加。ここではNAMESERVERアドレスとして、ローカルなDNSサーバを載せてあるRaspberry Pi 4のアドレスを指定してあります。
#define TCPCONFIG 1 #define _PRIMARY_STATIC_IP "192.168.2.59" #define _PRIMARY_NETMASK "255.255.255.0" #define MY_GATEWAY "192.168.2.1" #define MY_NAMESERVER "192.168.2.126"
そして名前解決をせまるドメイン名を変更。サンプルプログラムでは、Digi社のサーバのアドレスを解決するようになってましたが、申し訳ない?ので、当方サーバの名前解決を迫ることにいたしました。こんな感じ。
ip=resolve("jhalfmoon.com");
念のため、Linux上の dig コマンドで、「名前解決」してみたときの結果が以下に。
実験結果
サンプルプログラムのチョイ変なので、問題なくコンパイル成功、即座に実行してみたところ、以下のように標準出力に jhalfmoon.comのIPアドレスが返ってきました。
ちゃんとRaspberry Pi 4のDNSサーバを使っているのか確認するために例によってwiresharkでやりとりを覗いてみました。以下の水色の部分がうさちゃんとラズパイの間のDNSのやりとりデス。
うさちゃんからラズパイ4へのDNSクエリ・パケットが以下に。
応答できているみたいですな。次回は、ノンブロッキングなAPIをつかって、も少しDNSをほじくってみますか。