68user's page 掲示板

Prev< No. 1669> Next  [最新発言に戻る] [過去ログ一覧]
No. 1669 # 68user 2001/01/26 (金) 17:39:43
>>1667 rosegarden
> 私の場合 ports で Socekt6 インストールしたのですが、ちゃんと動きました。
うちの 4.2-STABLE だと
>>1662 68user
> Can't load '/home/68user/p5-module/i386-freebsd/auto/Socket6/Socket6.so'
でしたが、会社の 4.1-RELEASE だとうまくいきました。うちの環境が
変だったのかもしれません。

>>1667 rosegarden
> socket(Socket_Handle, $family, $saddr, $proto) || next;
> って
> socket(Socket_Handle, $family, $socktype, $proto) || next;
> のミスじゃありませんか?
む、まさにそこではまってました。それを直すと動いたのですが、
この Socket6 って変じゃないでしょうか? 以下の echo クライアントが
デッドロックしてしまうようです。
    
    #!/usr/bin/perl
    use Socket6;
    use Socket;
    
    @res = getaddrinfo('localhost', 'echo', AF_UNSPEC, SOCK_STREAM);
    $family = -1;
    
    while(scalar(@res) >= 5) {
            ($family, $socktype, $proto, $saddr, $canonname, @res) = @res;
            ($host, $port) = getnameinfo($saddr, NI_NUMERICHOST | NI_NUMERICSERV);
            print STDERR "Trying to connect to $host:$port $family...\n";
            socket(Sock, $family, $socktype, $proto) || die "socket: $!";
            connect(Sock, $saddr) && last;
            close(Sock);
            $family = -1;
    }
    if( $family != -1 ){
            select(Sock);
            $|=1;
            select(STDOUT);
            print "connected to $host port $port\n";
            print Sock "test!\n";
            print <Sock>;
            close(Sock);
    }

で、
    print <Sock>
の部分を
    $len = read(Sock,$buf,6);
    print "len=$len\n";
    print "buf=$buf";
とかすれば動きますが、
    $len = read(Sock,$buf,7);
だとダメです。内部でバッファリングしちゃってるのかなぁ?

>>1668 rosegarden
> IPv6 見てから、IPv4 見ると言うのは、システムによっては
> 変わるのでしょうか?
/etc/hosts のエントリ順 (::1 と 127.0.0.1 のどちらが上にあるか) に
よって変わるようです。

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