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

pasasの日記: Cプログラムとリゾルバ(その1)

日記 by pasas

C言語で書いたプログラムから MX レコードの取得方法がなんとなくわかったので、将来の自分用にメモ。
ちなみに参考文献は O'Reilly の DNS & BIND。

Cプログラムから MX レコードを取得するには、res_query() 関数を利用する。
res_query() 関数の使用方法はこちらの日記で書いた通り、

char answer[ PACKETSZ ];
int len;

len = res_query( name, C_IN, T_MX, answer, sizeof( answer));

というような感じで、answer の中に結果が得られる。

answer の中は次のようなフォーマットになっている。

  1. ヘッダ部
  2. 問い合わせ部
  3. 回答部
  4. 権威部
  5. 付加情報部

また、ヘッダ部のフォーマットは以下のようになっている。

typedef struct {
    u_short id; /* 問い合わせの ID 番号 */

    u_char qr:1; /* 回答フラグ */
    u_char opcode:4; /* メッセージの目的 */
    u_char aa:1; /* 権威的回答 */
    u_char tc:1; /* 切断されたメッセージ */
    u_char rd:1; /* 再帰要求 */

    u_char ra:1; /* 再帰可能 */
    u_char pr:1; /* プライマリサーバを要求(非標準的)*/
    u_char unused:2; /* 未使用 */
    u_char rcode:4; /* 回答コード */

    u_short qdcount; /* 問い合わせのエントリ数 */
    u_short ancount; /* 回答のエントリ数 */
    u_short nscount; /* 権威のエントリ数 */
    u_short arcount; /* 資源レコードのエントリ数 */
} HEADER;

以上の構造体は arpa/nameser.h の中で定義されている。
この中の opcode は今回の場合は 0 になる。

また、正常に終了したかどうかの結果は rcode に格納される。
rcode の値は以下の通り。

  • 0 - 正常終了
  • 1 - フォーマットエラー
  • 2 - サーバへのアクセス失敗
  • 3 - 存在していないドメイン
  • 4 - 実装されていない
  • 5 - クエリが拒否された

続きはまた次回。

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

あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall

読み込み中...