前提・実現したいこと
DNSサーバーに対して任意のホスト名を正引きし、サーバーからの応答によって真偽判断するプログラムをC#で作っています。
その際、サーバーから返ってくるパケットのAnswer部を解析し、その中からName部を人が理解できるドメイン名に変換するロジックの実装についてです。
一応自分が書いたコードは問題なく動くのですが、ループを多重に使ったのでとても可読性に欠けたコードになってしまい、もっと他にいいロジックがないかと思い質問させていただいた次第であります。
具体的な実装内容
基本的にDNSのRFCに準拠していれば問題ないのですが、要件(大まかなロジック)としては以下の通りです。
①DNSサーバーに対しホスト名を含んだドメイン名の正引きリクエストをする(ホスト名は任意です)
②DNSサーバーからレスポンスを受信し解析する
=解析について=
①まずレスポンス内のAnswer部のみをバッファにコピー
②AnswerCount分だけ正引きされた情報を読む
③各Answerに対しName部の解析を行い、人が理解できるドメイン名にしstring配列に格納(※)
③終了
大まかにいえば上記の通りになりますが、RFCに準拠させるとなると
・メッセージ圧縮されている場合を考慮する必要がある
・実際のパケットに含まれているのはwww.teratail.comのような情報ではなく、3www8teratail3comのようにラベルの文字数分の数値が格納される(※ここのことです)
・前述の通りリクエストするホスト名は任意なので様々な場合のホスト名をある程度考量する必要がある
上記のことから非常に長いロジックになってしまいました。(自作のは110行ほどでした)
なお日本語ドメイン名は考慮する必要はなく、ASCII文字で表現できる範囲内のドメイン名のみ考慮すれば問題ないです。
下記サイトの6で行われていることと逆のロジックと考えていただいて問題ないと思います。
http://park12.wakwak.com/~eslab/pcmemo/dns/dns5.html
その他
動作しているので急を要することではないのですが、自分の勉強のためにも何かいいロジック・参考サイトはありますでしょうか。
またソースコードについてはあまり公にしたくないので、もし必要であれば掲載いたします。
外部ライブラリを使うことも可能ですのでもしご存知でしたらお伺いしたいです。
また私自身C#を始めて半年ほどになりますので、入門書以上の技術を使われるようでしたら、補足情報を頂けると非常に有難い限りです。
かなり大まかな質問になり恐縮ですがお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/13 01:26