質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
DNS

DNSとは、Domain Name Systemのことで、インターネットなどのTCP/IPネットワーク上でドメイン名やホスト名と、IPアドレスとの対応づけを管理するシステムです。DNSのデータベースは、IPアドレスの4つの数字を通知するDNSサーバーで構築されており、IPアドレスをドメイン名から引き出す機能やドメイン名に関するメールサーバ情報を取り扱っています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

324閲覧

DNSパケットのName部を解析するロジックについて

siksmtt

総合スコア20

DNS

DNSとは、Domain Name Systemのことで、インターネットなどのTCP/IPネットワーク上でドメイン名やホスト名と、IPアドレスとの対応づけを管理するシステムです。DNSのデータベースは、IPアドレスの4つの数字を通知するDNSサーバーで構築されており、IPアドレスをドメイン名から引き出す機能やドメイン名に関するメールサーバ情報を取り扱っています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/08/10 08:37

前提・実現したいこと

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#を始めて半年ほどになりますので、入門書以上の技術を使われるようでしたら、補足情報を頂けると非常に有難い限りです。
かなり大まかな質問になり恐縮ですがお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

投稿2018/08/12 09:10

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

siksmtt

2018/08/13 01:26

YAmaGNZ様 ご回答ありがとうございます。教えていただいたリンクのコードのうち、GetDomainNameというメソッドが該当する部分になりそうです。 作成しているプログラムの仕様として、メソッドの引数の関係上、そっくりそのまま使うのは難しいですが、参考にしたいと思います。 まだ動かしてはいませんが、とても上手いロジックだなと非常に勉強になりました。 (ベストアンサーについてはもう少し他の回答者様のご意見を待ちたいので、2~3日ほどお待ちいただければ幸いです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問