68user's page 掲示板

Prev< No. 3328〜3331> Next  [最新発言に戻る] [過去ログ一覧]
No. 3328 # 68user 2003/09/09 (火) 21:36:40
>>3327 ken
> そのあと再びget_domainサブルーチンを呼び出すところからが…
> どうなるのでしょうか??(^^;
http://x68000.startshop.co.jp/~68user/net/resolver-2.html#6 の例だと、
最初に get_domain が受け取った $data が
      (0x04)www2(0xC0)(0x13)....
で、一回目の while ループが終了した時点で
        $data = "(0xC0)(0x13)...."
        @domains=('www2');★1
となっています。

二回目の while ループでは
      my $len = unpack('C', $data);
で $len は 0xC0 になり、
      if ( ( $len & 0xc0 ) == 0xc0 ){
が真なので
      my $offset = unpack('n', $data) ^ 0xc000;
          ⇒ $offset は 0x13
      my $new_data = substr($org_data, $offset);
          ⇒ $new_data は、UDP データグラム全体 ($org_data) の 0x13バイト目
      substr($data, 0, 2) = '';
          ⇒ $data は "(0xC0)(0x13)...." から "...." となる (先頭 2バイトを削る)
となります。$new_data には
      (0x09)startshop(0x02)co(0x02)jp(0x00)
が入っています。

ここで
     my ($domain_part) = get_domain($new_data, $org_data);★2
        push(@domains, $domain_part);★3
と get_domain を再帰呼び出しすると、
      sub get_domain {
            my ($data, $org_data) = @_;
の $data には
      (0x09)startshop(0x02)co(0x02)jp(0x00)....
が入っています。再帰呼び出しされた get_domain が処理を終えるときには
        @domains = ('startshop', 'co', 'jp');
となっており、最終的に
        return 'startshop.co.jp';
とドメインの一部を返します。

で、再帰呼び出しした側の get_domain に処理が戻ると、以下のような
流れになります。
    ★1 の @domains にはすでに www2 が入っている
    ★2 の $domain_part には、再帰呼び出しした get_domain から受け取った startshop.co.jp が入っている
    ★3 で @domains = ('www2', 'startshop.co.jp') となる


> また、else文の中の1行はどういった意味を持っているのでしょうか?
> ここでいう「カウンタ」という物もよくわからなくて…。
      (0x03)www(0x02)jp(0x07)FreeBSD(0x03)org(0x00)
の 3・2・7・3・0 がここでいうカウンタです。$len には
その後に続くバイト長が入っており、
      508: substr($data, 0, 1) = '';
はその $len の部分を削っています。

# 説明文で使用していない用語 (カウンタ) を、ソースで使ってはいけませんね。

No. 3329 # tomtom 2003/09/10 (水) 10:17:13
先日質問させていただいた、tomtomです。
クライアントが受信待ちの状態の時に、サーバに
ソケットをクローズされたら、クライアントは、
どうなるのでしょうか?

以前質問させていただいた時に、undefを受信してしまう
という問題があったのですが、サーバ側で勝手にセッションを
終了してしまっていた可能性があるので、その辺が関係している
かどうか疑問に思ったため、再度質問させていただきました。

No. 3330 # ken 2003/09/10 (水) 23:11:50
あ〜っ、なるほど!
わかりました!完璧にわかって疑問が紐解けましたよ〜!
get_domainの再起呼び出し後はそういう処理だったんですね…。
カウンタの意味もわかりましたし(^^;)、もうばっちりです!
長々と本当にありがとうございましたm(_ _)m
もしまた何かありましたら…よろしくお願いいたします(^^;

No. 3331 # lopper [E-mail] 2003/09/12 (金) 18:51:13
こんにちは、今Perl で UDP 通信を行うスクリプトを作っているの
ですが、少し分からないところがあるので質問させてください。

普通に UDP 通信は問題なく行えているのですが、送信元の IP アドレスが
拾えなくて悩んでおります。
recv 関数の戻り値で「送信元のアドレス」は拾えるのですが、送信元が
「どこへ宛てて送信したか?」が分からないのです。
IO::Socket::INET モジュールを使用していますが、peeraddr メソッドを
使っても何も返ってきません。

http://x68000.startshop.co.jp/~68user/net/udp-3.html に UDP で
connect 出来ると書かれていますが、connect すれば送信先アドレスを
拾う事ができますでしょうか?

ご存じの方、よろしくお願いいたします。

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