68user's page 掲示板

Prev< No. 4392〜4405> Next  [最新発言に戻る] [過去ログ一覧]
No. 4392 # DNS勉強中 2005/11/14 (月) 00:18:28
>>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 を触ったことのより、ある程度検証をする必要があるのかなと思います。
月曜日は予定が入っているので、まとめるのは難しいかも知れませんが、
火曜日くらいにある程度まとめて一度アップしてみようと思います。

いろいろ参考になるアドバイスをいただきまして、ありがとうございます。

No. 4393 # DNS勉強中 2005/11/14 (月) 09:44:17
to 68userさん

さっそくですが、IPv6 のアドレス省略について
双方のプログラム(resolver-1.pl, 1058.txt)に
バグがあるかも知れないのでご報告します。

一例として、 198.41.0.4 www.yahoo.co.jpと入力して、
{A, B, C, D, E, F}.DNS.jpを表示させたとき、
追加情報の F.DNS.jp の出力結果は下記のとおりになります。

resolver-1.pl
2001:2F8::100::153

私の出力結果
2001:2f8::100:0:0:0:153

ちなみにEtherealの出力結果は下記のとおりです。
2001:2f8:0:100::153

IPv6 のアドレス省略表記に関する説明を下記のサイトで拝見したのですが、
http://www.soi.wide.ad.jp/iw2001/slides/04/04-1/53.html
そこには IPv6 のアドレス表記に関して2つの原則が書かれていました。
1,【連続する】0 のブロックは省略できる。
2,省略できるのは【1ヶ所】だけ。

そして出力結果から推察するに、
resolver-1.pl では、原則の1, 2共に満たしてないように見受けられます。
perl が分からないので想像ですが、
resolver-1.pl では 0 を見つけたら即座に :: に置き換え、
何回でも省略が使用できるように組んであるのかなと思われます。

私の方では、一度省略を使用したら、二度と使えないようには組んでいるのですが、
0 は即座に :: に置き換えております。
そのため 0 を見つけたら、次の場所を見て、
・次の場所も 0 なら :: に置き換える
・次の場所が 0 で無ければ、 0 を出力する。
というコードを追加しないといけないかもしれません。

勘違いでしたらすいません。

No. 4394 # 68user 2005/11/15 (火) 01:45:04
>>4393 DNS勉強中
ありがとうございます。

とりあえず TYPE=TXT の件と IPv6 の件を bugid20・21 として登録しました。
    http://x68000.q-e-d.net/~68user/bugnote/bugindex.php?projectid=1


ちなみになぜわたしが web を更新しないのは、解説文からソースへの
リンク方法が
    http://x68000.q-e-d.net/~68user/cgi-bin/cvsweb.cgi/public_html/net/org/resolver-3.html?rev=1.11&content-type=text/x-cvsweb-markup
のように
    :preinclude 21-106
などと行番号で指定しているため、修正が非常に面倒であるからです
(まぁただの言い訳なのですが)。

+10 などの相対指定にしようかとか、
      m/bind\(/
などと文字列で引っ掛けようかとか迷いつつここまで来てしまいました。
ご指摘を頂いたことについては大変感謝しておりますが、修正が遅いのは
なにとぞご容赦ください。

No. 4395 # 68user 2005/11/15 (火) 01:55:14
>>4392 DNS勉強中
> ただし、 void class_print(int class) を用いた共用の記述の仕方が
> 分からなかったので、
> codelist_t {class, type}_list[] = { ... };をグローバル化して共用しています。
一般的には、codelist_t を扱う関数を別ソースにし、ソース先頭で
    static codelist_t class_list[] = { ... };
と配列を宣言して、conv_class()・class_print() でその配列を使用
します。static をつければ外部ソースからアクセスできないので、
隠蔽できます。

ただ、複数ファイルに分けると、ヘッダファイルが必要だったり Makefile を
書きたくなったりするので、サンプルであれば分ける必要はないかもしれません。


それはそれとして複数のソースから構成される場合に、グローバル変数の
宣言をヘッダファイルで一元管理する方法をご存知なければ、一度書いて
みるとよいでしょう。

      --- var.h ----
      #ifdef THIS_IS_MAIN
      #define GLOBAL
      #else
      #define GLOBAL extern
      #endif
      GLOBAL class_list[] = {...};
      
      --- main.c ---
      #define THIS_IS_MAIN
      #include "var.h"

      --- sub.c ---
      #include "var.h"

こんな感じです。

No. 4396 # DNS勉強中 2005/11/15 (火) 12:19:47
>>4394 68user
修正の件了解致しました。

その後修正したもの
・教えていただいた
>struct DNS_Response {
> char data[10000];
> int int_data[10000];
> int pos;
>};
の構造体を下記のような感じに少し修正し、流用しました。
/* DNSサーバへの質問 */
struct DNS_Query {
    char data[10000];
    int length;
};
/* DNSサーバからの応答 */
struct DNS_Response {
    int int_data[10000];
    int pos;
};
今まで int_data と pos の 2 つの引数を渡していたところが、
struct DNS_Response だけを渡せばよくなったので、
分かりやすくなったかなと思います。

・ linux 版の warning を解消しました。
てっきり netdb.h を include したら
sys/socket.h なども include してくれるものだと勘違いしておりました。
そのため、いままでの作ってきた他のソースでも warning がたくさん出ておりました。
大変勉強になりましたm(__)m。

・ AAAA の表示を仕様に添った形に変更しました。

そんな感じに修正を施した現状のソースをアップロードしておきます(linux版)。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1091.txt

後、指摘された部分で残っている修正点は
・ hoge_print 関数の書き方
・ >>4395 全般
くらいかなと思います。
直したつもりで、意図に沿っていない修正をしている箇所はあるかもしれませんが(^^;。

他には、個人的に「フラグを構成する各要素」を
resolver-1.pl のように簡単に設定出来た方が良いかなと思ってます。
私のソースでは、下記一行で設定してしまってるのがいまいちかなと。
DNS_packet->flag = 0x0100;
ビットフィールドあたりで記述してうまく動作すれば良いのですが。
もっともここ自体は今回のソースでは変更することはなさそうなので、
このままでも良いのかもと思ったりも…。

No. 4397 # DNS勉強中 2005/11/15 (火) 17:14:29
>>4395 68user
今まで一つのソースで完結するものばかり書いていたので、
static の付いたグローバル変数(内部結合グローバル変数)を
使った事はありませんでした。
大変勉強になりました。

後、グローバル変数の宣言を一元管理する方法は存じてなかったので、試してみました。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1093.txt
ただ上記は意図に沿った記述かどうか自信がありません。
それと、この件は今回のソースとは直接関係ないという認識で宜しいでしょうか?
仮に提示どおりソースを分割しても
class_list[] は sub.c でしか必要ないのかなと思ったので。

その後修正したもの
・ ソースを main.c, sub.c, var.h に分割しました。
・ 「フラグを構成する各要素」を resolver-1.pl のような感じに変更しました。

main.c(linux版)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1094.c
Makefile(linux版)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1095.txt
sub.c(linux版)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1096.txt
var.c(linux版)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1097.txt

No. 4398 # 68user 2005/11/16 (水) 03:05:19
>>4397 DNS勉強中
> http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1093.txt
> ただ上記は意図に沿った記述かどうか自信がありません。
そういえばわたしには、複数ファイルから参照されるグローバル変数で、
宣言と初期化を同時に行った経験がありませんでした (わたしはこういう
場合は init_hoge() という関数を作るので)。

要は main.c で
    codelist_t class_list[];
    codelist_t class_list[] = {
        {"INTERNET", 1},
        ...
    };
となるわけですが、これはコンパイル通りますか? 少なくとも警告くらいは
出そうな気がします。

普通はどう書くんでしょうね>どなたか

> それと、この件は今回のソースとは直接関係ないという認識で宜しいでしょうか?
その通りです。

その他ソースについて。
> int soa_record_print(struct DNS_Response *DNS_response, char *print, int i)
引数が i というのはかなりいただけないので、record_num あたりで。

> for (i=0; type[i]!='\0'; i++)
> /* 照会タイプの文字の中に英小文字があれば英大文字に変換 */
> type[i] = toupper(type[i]);
そういえば strcasecmp(3) というライブラリ関数があるのを思い出しました
(使ったことはないですが)。

> void qr_print(int qr){
> codelist_t qr_list[] = {
> ...
> };
動作的には問題ありませんが、関数呼び出しのたびにスタックに qr_list の値が
積まれるのは無駄なので、一般的には
      static codelist_t qr_list[] = { ... };
とします。これだとスタックではなくヒープに置かれ、初期化は一度しか行われません。

> Makefile(linux版)
> http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1095.txt
わたしなら以下のように書きますが、あまり Makefile に詳しくないので怪しげです。

    TARGET= domain_to_ip
    OBJS = main.o sub.o
    CFLAGS = -Wall
    $(TARGET): $(OBJS)
            $(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
    .c.o: sub.h
            $(CC) $(CFLAGS) -c $<
    clean:
            rm -f *.o *~ core $(TARGET) $(OBJS)

あと、main がとても長くて汚い関数に見えますので、
    make_query();
    send_receive();
    parse_response();
の 3行か+エラー処理か、あるいは
    make_query();
    send_query();
    receive_response();
    parse_response();
の 4行+エラー処理くらいになるとよいかも、と思いました。

続く。

No. 4399 # DNS勉強中 2005/11/16 (水) 17:13:10
>>4398 68user
1093.txtのソースは何故か警告が出ることも無く、コンパイル出来ました。
定義を二回していますので、仰るとおり何か言われてもおかしくないと思われますが。

ちなみに下記はエラーが出ません。
    #include <stdio.h>
    int a;
    int a = 10;
    int main(void)
    {
        printf("a = %d\n", a);
        return 0;
    }

ただし下記はエラーが出ます。
    #include <stdio.h>
    int main(void)
    {
        int a;
        int a = 10;
        printf("a = %d\n", a);
        return 0;
    }

上記の結果をみると、グローバルでは複数定義してもかまわないのかもしれません。
それと、本来は定義 codelist_t class_list[] = {...} をmain.cに書いて、
宣言 extern codelist_t class_list[]; を sub.c に書くのかも知れません。
ただ、そういたしますと、どうヘッダで一元管理すれば良いか思いつきませんでした。

修正した所
・ soa_record_print の引数
・ codelist_t を auto から static に変更しました。
static はどうしても値を保持し続けておかないといけない物以外には
使う必要がないと思ってました。
auto なら不要になったら解放されますし。
メモリ領域は、よく分かってないので勉強になります。
・ main 部分を
    preprocessing(); … 前処理
    make_query(); … 照会用の DNS パケットを作成
    send_query(); … DNS サーバに問い合わせを送信
    receive_response(); … DNS サーバからの応答を受信
    parse_response(); … DNS サーバからの応答を解析
に集約しました。

分からなかった所
・strcasecmp は、「大文字/小文字を無視して二つの文字列を比較する」そうですが、
私のソースでどうすれば有効活用出来るか分かりませんでしたので、使用しておりません。

それと Makefile のサンプルありがとうございません。
その記述で動作することを確認しました。
その書き方ですと、ソースファイルが増えても OBJS に追加するだけで良いので、
大変助かりました。

現状のソース(linux版(1ソース版))
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1101.txt
上記のソースは今までと少し動作が違いまして、
【実行ファイル DNSサーバ 名前解決ホスト名】
と入力しますと、回答が得られるまで名前解決を行います。

現状の問題点
・ リソースデータがドメイン名だけで、IPアドレスの情報が無いと名前解決が出来ない。
例) 198.41.0.4 www.livedoor.co.jp
zns05.data-hotel.net と zns06.data-hotel.net しか返してくれません。

get_domain(); で、ドメイン名のラベルの部分を出力し、
print_domain(); で【.】を出力し、
ドメイン名の終端に達するまで両関数間を行ったりきたりしているのが原因です。

DNS サーバが IP アドレスでしたら、
a_record_print(); で姑息に sprintf で抜き出せたのですが。

そう考えますと、以前仰られていた

> あと、hoge_print 関数も、わたしはこういう書き方をせずに
> char *a_record_print(int_buf, search);
> と文字列を返すほうですが、メモリ確保を行うのは呼び出し側か、関数の
> 中で static に持つか、など悩ましいです。すっぱり割り切って関数内で
> printf するのも、保守性はともかく可読性は悪くない、と思いました。

の部分が非常に重要かなと思いました。
文字列を上位に返すようにしていれば、流用もしやすかったのかなと。
そういう部分も保守性なのかなと思いました。

No. 4400 # DNS勉強中 2005/11/17 (木) 17:11:38
to 68userさん
急な話ですが、昨日の夜に就職が決まりまして、
来週月曜日からの勤務となりました。
そのため研修は明日で修了となりました。
そして課題の提出も明日となりました。
そのため、ご指摘いただいた箇所すべてを訂正して、
提出することは無理かなと言う感じです。
いろいろ教えていただきましたが、
それらをすべて反映できないことはお許しください。

修正したところ
・ hoge_print 関数を文字列を返す形に変更(それに伴い関数名も変更)

resolver-1.pl 互換を目指した Linux 版
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1107.txt

学校の課題用に上記ソースを修正した Linux 版
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1108.txt

表示イメージは下記のとおりです。

実行ファイル名 198.41.0.4 www.livedoor.com
DNSサーバ【198.41.0.4】に【www.livedoor.com】の名前解決を依頼
DNSサーバ【198.41.0.4】からの受信データバイト数: 506バイト
DNSサーバ【192.12.94.30】に【www.livedoor.com】の名前解決を依頼
DNSサーバ【192.12.94.30】からの受信データバイト数: 120バイト
DNSサーバ【203.174.65.123】に【www.livedoor.com】の名前解決を依頼
DNSサーバ【203.174.65.123】からの受信データバイト数: 136バイト
回答(1): リソースデータ: 203.131.197.197

nslookup のような感じの表示に近づけつつ、
実際に再帰的に DNS サーバに問い合わせを行っている事を視覚的にアピールしつつ、
提出期限が迫っているので、現状のソースをなるべく触らない方向でまとめてみました。

なお学校の課題用は最近取り掛かったこともあり、
完成度は前者に比べかなり劣ってます
(実用に耐えれないという意味ではどちらも同じですが)。

No. 4401 # 68user 2005/11/18 (金) 05:26:21
>>4400 DNS勉強中
おめでとうございます。向上心のある方のように見受けられますので、どんな
業界でも能力を発揮できることと思います。ご活躍を期待しております。

わたしの方は指摘点をまとめているところですが、あまり時間が取れず
進んでいません。課題提出後なので意味はありませんが、中途半端なのは
気持ちが悪いので、infoseek の方はしばらくそのままにしていただけると
ありがたく思います。

No. 4402 # DNS勉強中 2005/11/18 (金) 18:39:49
>>4401 68user
ありがとうございます。
それと本日は作成したプログラムのドキュメント作成などで時間が取れなかったので
結局 >>4400 のソースを二つとも提出しました。

後、指摘点をまとめていただいていると言うことでどうもありがとうございます。
私のほうでも修正し次第アップロードします。

それとアップロード先の infoseek ですが、
私の管理下に無いアップローダにアップロードしております。
そのため何時消えてしまうか分からないのが現状です。
もっとも一年近く前のアップロード品も残っているようなので、
大丈夫だとは思います。

消えたら別の場所にアップロードします。

No. 4403 # DNS勉強中 2005/11/22 (火) 22:13:22
今日は仕事が休みで時間があったのでソースコードを修正しました。
resolver-1.pl 互換を目指した Linux 版
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1142.zip

修正点
・自作関数が文字列を返すことに伴い、グローバル変数が増えてしまったので、
ローカル static 変数に変更しました。
・原則 1 つの関数につき、 1 つのソースコードにしました。
そのためソースファイル数が 30 あまりになりました。
ただし、グローバル変数の宣言の定義がよく分からなかったので、
class_list と type_list 関係は type_and_class.c でひとまとめにしました。
・関数の流れ図?を簡易的に表した html を作成しました。

No. 4404 # DNS勉強中 2005/11/27 (日) 17:36:49
resolver-1.pl 互換を目指した Linux 版
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1160.zip

微修正を加えただけです。
ただこれで、指摘していただきました問題点についてはすべて対応したつもりです。

それと、昨日引越しを伴う出向を言い渡されました。
当分の間ネットにつなげる環境も開発環境も無いと思われます。
そのため何かご指摘いただいても、返答を差し上げることは出来ないと思います。
よろしくお願いします。

No. 4405 # SSL初心者 2005/11/28 (月) 14:44:25
こんにちは。
だいぶ前に書き込みをしたものですが
今回自力で何とかしてみようとふんばってみたものの、
2週間近く解決できません
助言をお願いいたしたく書き込みをしました。

SSLを↓のHPを参考に設定してみました
http://www.rinzo2.jp/~rinzo/apache_ssl/apache_and_ssl_00.htm
何とか起動はしたんですが、
当初の目的では、
課題として作成したmysqlとJSP(Tomcat4.1)を使用し
作成したjspファイルを
SSLの状態で表示させることでした。

例)
http://localhost:8080/examples/index.jsp

https://localhost:8080/examples/index.jsp
の形に


何とかできないかと、Apache2とTomcatを連携させてみたものの
できませんでした。
もともとできないのかもわからず、
書き込んでみました。

あたりまえのことができてない
といった返答でもいんで
なるべくわかりやすく
助言のほどお願いします。

設定等で疑問のほどありましたら
わかる範囲で答えますんでよろしくお願いします

Prev< No. 4392〜4405> Next  [最新発言に戻る] [過去ログ一覧]