うさちゃんと一緒(25) Z80の魔改造? Rabbit4000でDNSクエリその1

Joseph Halfmoon

前回までうさちゃん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つソースがあるのを見つけました。

    1. ブロッキング・スタイルのDNSリゾルバ
    2. ノンブロッキング・スタイルの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 コマンドで、「名前解決」してみたときの結果が以下に。LinuxDigResults

実験結果

サンプルプログラムのチョイ変なので、問題なくコンパイル成功、即座に実行してみたところ、以下のように標準出力に jhalfmoon.comのIPアドレスが返ってきました。Rabbit4000blockingDNSResult

ちゃんとRaspberry Pi 4のDNSサーバを使っているのか確認するために例によってwiresharkでやりとりを覗いてみました。以下の水色の部分がうさちゃんとラズパイの間のDNSのやりとりデス。Rabbit4000DNSQueryWRpi4

うさちゃんからラズパイ4へのDNSクエリ・パケットが以下に。Rabbit4000Q00

ラズパイ4から、うさちゃんへのDNSレスポンスが以下に。Rabbit4000Q10

応答できているみたいですな。次回は、ノンブロッキングなAPIをつかって、も少しDNSをほじくってみますか。

うさちゃんと一緒(24) Z80の魔改造? Rabbit4000でアセンブラその2 へ戻る

うさちゃんと一緒(26) Z80の魔改造?Rabbit4000でDNSクエリその2 へ進む