パスワードを忘れた? アカウント作成
451148 journal

pasasの日記: Cプログラムとリゾルバ(最終回)

日記 by pasas

結局 Cプログラムから MX レコードを引くプログラムを作成する仕事はなくなったので、書くのを忘れていた。
とりあえず将来に向けたメモということで最終回を書いておこう。

例えば次のように実行するとする。

char answer[ PACKETSZ ];
int len;

len = res_query( "slashdot.jp", C_IN, T_MX, answer, sizeof( answer));

とすると、answer には以下のような値が入る。

-- | +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
---+------------------------------------------------
00 | 21 51 81 80 00 01 00 01 00 00 00 00 08 73 6C 61
10 | 73 68 64 6F 74 02 6A 70 00 00 0F 00 01 C0 0C 00
20 | 0F 00 01 00 01 51 47 00 11 00 0A 04 6D 61 69 6C
30 | 04 6F 73 64 6E 02 6E 65 C0 15

前の日記でも書いたように先頭から 12バイトはヘッダである。
ここから各部分のエントリ数は以下のようになっていることがわかる。

・問い合わせ部 - 0x0001(0x04-0x05)
・回答部 - 0x0001(0x06-0x07)
・権威部 - 0x0000(0x08-0x09)
・資源レコード部 - 0x0000(0x0A-0x0B)

まず、問い合わせ部の内容は、

・ドメイン名 - "8 slashdot 2 jp 0"(0x0C-0x18)
・問い合わせタイプ - 0x000F(MX レコード)(0x19-0x1A)
・問い合わせクラス - 0x0001(IN)(0x1B-0x1C)

続いて回答部のデータは、

・ドメイン名 - 0x0C へのポインタ(0x1D-0x1E)
・タイプ - 0x000F(MX レコード)(0x1F-0x20)
・クラス - 0x0001(IN)(0x21-0x22)
・TTL - 0x00015147(86343秒=23時間59分3秒)(0x23-0x26)
・資源データの長さ - 0x0011(0x27-0x28)
・プライオリティ - 0x000A(0x29-0x2A)
・アドレス - "4 mail 4 osdn 2 ne" + 0x15へのポインタ(0x2B-0x39)

となる。(カッコ内の16進数は回答データのアドレス。)

ドメインは問い合わせ部以外はすべて圧縮されていて、展開するのが面倒である。
これを解決するために dn_expand() 関数がある。
dn_expand() 関数は以下のような形になる。

int dn_expad( char *msg, char *eomorig, char *comp_dn, char *exp_dn, int length)

msg - 回答パケットの先頭へのポインタ
eomorig - メッセージの最後部の次のバイトへのポインタ
comp_dn - メッセージ中の圧縮されたアドレスへのポインタ
exp_dn - 展開したアドレスを格納するためのポインタ
length - exp_dn の大きさ

とりあえず以上。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

ソースを見ろ -- ある4桁UID

読み込み中...