>>4388 68user >>4390 68user >>4391 68userさん 今日は上記3レスでアドバイスいただいた内容についてある程度修正したり、 理解に努めておりました。 ・ struct DNS_Query *query; の必要性について理解いたしました。 確かに仰られるとおり、ソースが理解しやすくなると思いました。 そのため、その部分は修正しました。 (ただ make_question, make_query との関係上、一部修正しております)。 また、make_question と make_query を作成することにより、 main 部の記述を減らし、ソースを読みやすくしました。 ただ、記述していただいたとおりに作れなかったので、メイン部に make_question(&DNS_question); count = make_query(&DNS_query, argc, argv[2], argv[3], argv[4]); と2つにわけて記述しております。 ・ パディングについても理解いたしました。 確かに私の以前のソースはパディングが入らない前提で組んでありました。 やっと意図されたことが分かりました(^^;。 ・ /usr/include/bfd.h をみて、 プロトタイプ宣言について仰られていることを確認・理解し、修正しました。 ・ perror を用いエラー処理を追加しました。 ・ 抜けていた gethostbyname のエラー処理を追加しました。 ただし、 herror や hstrerror を Windowsで使う方法が分からなかったので、 とりあえず perror を使っております。 ・ return と exit の混在を解消しました。 それにともない、 main に戻らずに終了していた所を、 main に戻って終了するように変更しました。 またそれらしいエラー情報を出力するように変更しました。 ・ two_bytes の記述変更について理解いたしました。 アドレス渡しで現在位置を変更して、 戻り値で2バイトの値を取得する方法は大変参考になりました。 確かに、教えていただいた記述の方が何かと便利ですので、 ほぼ同じソースを移植させていただきました。 それに伴い、謎の search += 1; を修正しました。 また four_bytes も同様にソースを変更しました。 この作業を実施したことにより、 search += 2; や search += 4; を大幅に減らすことが出来ました。 ・ conv_type, conv_class, class_print, type_print を codelist_t を使用する形に変更しました。 ただし、 void class_print(int class) を用いた共用の記述の仕方が 分からなかったので、 codelist_t {class, type}_list[] = { ... };をグローバル化して共用しています。 また、 qr_print, opcode_print, aa_print, tc_print, rd_print, ra_print, rcode_print も同様に codelist_t { ... }_list[]化しました(こちらはローカル)。 ・ 0 と \0 の混在を修正しました。 ・ 変数名や関数名の命名を修正しました。 ・ フラグ部分のインデントを変更しました。 ブロックで囲むと言う発想が出てこず、 かといって、インデントなりコメントで上下を囲むなどしないと、 のちのち分からないだろうなと思い、 インデントしてしまったのですが、 ブロックで囲むと言う方法が教えていただき、大変参考になりました。 とりあえず今日修正できたところは以上です。 上記以外の部分についてはまだ手をつけておりません。 他に、今まで教えていただいた事を他の部分にも流用できないか、 ソースを一通り読み直してみて調べてみようと思います。 また search を触ったことのより、ある程度検証をする必要があるのかなと思います。 月曜日は予定が入っているので、まとめるのは難しいかも知れませんが、 火曜日くらいにある程度まとめて一度アップしてみようと思います。 いろいろ参考になるアドバイスをいただきまして、ありがとうございます。 |