68user's page 掲示板

Prev< No. 1007〜1017> Next  [最新発言に戻る] [過去ログ一覧]
No. 1007 # 68user 2000/07/25 (火) 16:27:35
flock の件は後程。

> rlogin,ftp,telnetなどで、ホスト名を指定した時に、どのようにして、
> DNSサーバーとやり取りをしているのですか?
rlogin/ftp/telnet などは、ユーザからホスト名を受け取ると
gethostbyname(3) などを使って、ホスト名から IP アドレスを
得ようとします。

gethostbyname の内部では、ソケットを使って DNS サーバに
アクセスします。で、DNS サーバは UDP の port 42 を
listen していて (UDP だから listen という表現は変?)、
クライアントからの問い合わせに応じて IP アドレスを
教えたり、他の DNS サーバに問い合わせたり、見付から
ないよと答えたりします。

こういう問い合わせを行う DNS クライアント (この例では
gethostbyname) のことを resolver と言います。resolver は
概念的なもので、問い合わせを一手に引き受ける resolver
サーバのようなものがあるわけではありません。ただのライブラリです。
なので、自分で外部の 42/udp にアクセスする DNS クライアントを
書く事もできます。

> DNSサーバーはhttpみたいなデーモンが動いているですか?
UNIX 界で DNS サーバとして有名なのは bind です。
プログラム名は named。
# apache と httpd の関係と似ています。

No. 1008 # 68user 2000/07/25 (火) 16:57:08
> こういう問い合わせを行う DNS クライアント (この例では
> gethostbyname) のことを resolver と言います。
いや、違うか。

res_query, res_search, res_mkquery, res_send, res_init,
dn_comp などの DNS サーバへ問い合わせを行うライブラリ
関数群のことを resolver といいます。gethostbyname などは
これらの関数を孫請けとして呼んでいます、かな。
# See resolver(3).

No. 1009 # ちゃいぱ [URL] 2000/07/25 (火) 17:01:14
回答ありがとうございます。

では、DNSクライアントとnamedデーモンが、
UDPプロトコルでportの42番でやり取りすると理解してよろしいですね。

すっきりしました。
ありがとうございました。

No. 1010 # gongo [E-mail] 2000/07/25 (火) 23:48:36
はじめまして、gongoと申します。
いきなりで申し訳ありませんが質問があります。
私はXアプリケーションの勉強を始めたばかりなのですが
XライブラリとXツールキットを用いたプログラムを書こうとして
行き詰まってしまいました。
と言いますのは、例えばXツールキットを用いて表示させた窓に
Xライブラリを用いて直線を引いたりする方法がわかりません。

XDrawLine(XtDisplay(w),XtWindow(w),gc,x1,y1,x2,y2);

といった感じでプログラムの中に書き込みますとコンパイルは
できるのですが、実行させるときにXDrawLineのところで
Segmentation faultで止まってしまいます。
本もいろいろと読みましたがどうにもうまくいきません。

作成途中のプログラムは以下のところにあります。
http://www.din.or.jp/~gongo/xtshirt.c(本体)
http://www.din.or.jp/~gongo/color.dat(色の数値)
どうか宜しくお願い致します。

No. 1011 # 68user 2000/07/26 (水) 00:48:58
> では、DNSクライアントとnamedデーモンが、
> UDPプロトコルでportの42番でやり取りすると理解してよろしいですね。
その通りです。

> 例えばXツールキットを用いて表示させた窓に
> Xライブラリを用いて直線を引いたりする方法がわかりません。
非常に興味のある分野なので答えたいのはやまやまなのですが、
Xt を触ったことがないのでわかりません。でも、DrawLineOnWidget 内で
drawgc を使ってますが、DrawLineOnWidget を呼び出す前に
drawgc に GC をセットし忘れているように見えます。

あと、戻り値を見ると XtWindow(w) で NULL が返ってるのが
問題…なのかなぁ。解決法がわかったら教えて下さい。

No. 1012 # gongo [E-mail] 2000/07/26 (水) 01:39:54
> 非常に興味のある分野なので答えたいのはやまやまなのですが、

素早いご返答ありがとうございます。

> drawgc を使ってますが、DrawLineOnWidget を呼び出す前に
> drawgc に GC をセットし忘れているように見えます。

本によると、ウィジェットをリアライズした後にGCを
設定するようなことがかいてありましたもので
XtRealizeWidget(toplevel);
よりも後にdrawgcをセットすることにしたのです。
もう少し調べてみます。

> あと、戻り値を見ると XtWindow(w) で NULL が返ってるのが

すみません、これはどういうことなのでしょうか。
NULLが返ってくるというのはどのように調べたらよろしいのでしょうか。
NULLが返ってるとなるとおそらくここが悪いのだと思います。
う〜ん、もう少し調べてみます。

No. 1013 # 68user 2000/07/26 (水) 09:20:32
> XtRealizeWidget(toplevel);
> よりも後にdrawgcをセットすることにしたのです。
うーん、XDrawLine を呼んだ時点で X サーバとの通信が
行われると思うんで、やっぱりセットしておかないと
いけないんじゃないかなぁ…。GC は
    typedef struct _XGC * GC;
なので、GC の中身がゴミ (初期化してないので) だと
まずいと思うのです。

> NULLが返ってくるというのはどのように調べたらよろしいのでしょうか。
printf("%d\n",XtWindow(w)) としました。他の部分で同じことを
すると何か値が入っているのですが、XDrawLine の前で表示させると
0 となってしまうので、XtWindow がこけてるのかと思いました。

まぁ、知識がないのに推測を重ねるのもアレなので、
会社にある本を読んで調べてみます。

No. 1014 # gongo [E-mail] 2000/07/26 (水) 19:38:45
> 他の部分で同じことをすると何か値が入っているのですが、
> XDrawLine の前で表示させると 0 となってしまうので、
> XtWindow がこけてるのかと思いました。

例えばDrawLineOnWidget(label)の書いてあった手前に

printf("XtDisplay(label) = %d\n",XtDisplay(label));
printf("XtWindow(label) = %d\n",XtWindow(label));

と書いたところ、XDrawLine の前で表示させるのと同様に
次のようになってしまいました。

XtDisplay(label) = 67584
XtWindow(label) = 0

やはり0というのはまずいのでしょうか。labelを使い回して
いくつかの窓を表示させようとしているのがまずいのか・・・。

あとdrawgcのセットをDrawLineOnWidget(w)の中で下記のように
行ってみたところ、

drawgc=XCreateGC(XtDisplay(w),XtWindow(w),0,NULL);
XSetForeground(XtDisplay(w),drawgc,pixel[1]);
XSetBackground(XtDisplay(w),drawgc,pixel[0]);

DrawLineOnWidget(label)は抜け出て、ok6までは到達したのですが

X Error of failed request: BadDrawable (invalid Pixmap or Window parameter)
    Major opcode of failed request: 55 (X_CreateGC)
    Resource id in failed request: 0x0
    Serial number of failed request: 35
    Current serial number in output stream: 48

となってしまいました。

お手数お掛け致しまして申し訳ございません。

No. 1015 # gongo [E-mail] 2000/07/26 (水) 20:03:01
> labelを使い回していくつかの窓を表示させようとしているのがまずいのか・・・。

各窓がだぶらないようにlabel1,label2,・・・といったように
してみましたが結果的にうまくいきませんでした。

No. 1016 # 68user 2000/07/27 (木) 02:42:45
根本的には何がまずいかと言うと、
    1. GC をセットしていない (その結果 core dump)
    2. Window がマッピングされる前に XtWindow を実行している
         (その結果 X Error)
だと思います。1は先に述べた通り。2は XtWindow の前に
XtRealizeWidget が必要なんでしょう。

で、そういえば一応 Xt の本を持ってたな〜と思い出したので読んでみると、
    a. Form ウィジェットの上に Simple ウィジェットを作成
    b. Simple ウィジェットに、Exposure イベントへの
         コールバック関数を設定
    c. XtAppMainLoop でイベント待ち
    d.コールバック関数が呼ばれて、その中で XDrawLine
という手順を踏んでました。

実際には何も試してませんが、上の通りにやってみては
いかがでしょう。なお、a は必須かどうかわかりません。
Label ウィジェットに直接 XDrawLine できるのかもしれません。

flock の件はまたまた後程。うーん、調べる時間がない…。

No. 1017 # gongo [E-mail] 2000/07/27 (木) 05:23:23
> 実際には何も試してませんが、上の通りにやってみては
> いかがでしょう。なお、a は必須かどうかわかりません。

ありがとうございます。いろいろ試してみます。

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