pasasの日記: Cプログラムとリゾルバ(その1)
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 の中は次のようなフォーマットになっている。
- ヘッダ部
- 問い合わせ部
- 回答部
- 権威部
- 付加情報部
また、ヘッダ部のフォーマットは以下のようになっている。
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 - クエリが拒否された
続きはまた次回。
Cプログラムとリゾルバ(その1) More ログイン