68user's page 掲示板

Prev< No. 1666> Next  [最新発言に戻る] [過去ログ一覧]
No. 1666 # rosegarden 2001/01/26 (金) 16:01:58
ちょっと便乗して試して見たのですが、
>>1660 68user
> - perl が IPv6 に対応しているかどうか。perl-5.005_03 なら多分
> 無理。5.6 か 5.7 で対応したかもしれません。Socket6 というのを
> 使えば 5.005_03 でもいけるのかもしれませんが、僕は試したことが
> ありません。
なんか、FreeBSD の /usr/bin/perl は IPv6 に対応してない感じですね。
4-stable も 5-current(こちらは perl 5.6.0)も試しました。
perldoc Socket6 して出て来る IPv6 の daytime のサンプルを試しましたが、
socket: Protocol not supported
などというエラーを返します。もちろん、inetd.conf 書き換えて、IPv6
の daytime は使えるようにしてあるのですが。一方、添付の C プログラムは
うまくいくので、設定ミスではないと思うのですが。だいたい
telnet ::1 13 もちゃんと反応しますし。

>>1665 kaori
うちでは、localhost しか試せないのですが、kaori さんのところでは
perl でもうまく行っていますか? perl 自体にも IPv6 のパッチあてないと
いけないのでしょうか? とりあえず、Socket6 使って嬉しいのは IPv6/IPv4
両用に書かれたスクリプトでも動作する程度しかありませんね。うちの場合。
KAME パッチをあてて perl を make してみようとも考えましたが、
perl の開発スピードの方が早すぎるようで、パッチが追従しきれてません。

どなたか、うまくいったという方がいらっしゃったら、教えてください。

#include <stdio.h>
#include <string.h>
#include <err.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

int
main(int argc, char *argv[])
{
    struct addrinfo hints, *res, *res0;
    int error;
    int s;
    const char *cause = NULL;

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    error = getaddrinfo("localhost", "daytime", &hints, &res0);
    if (error) {
        err(1, "%s", gai_strerror(error));
    }
    s = -1;
    for (res = res0; res; res = res->ai_next) {
        char hostname[NI_MAXHOST], servname[NI_MAXSERV];

        s = socket(res->ai_family, res->ai_socktype,
            res->ai_protocol);
        if (s < 0) {
            cause = "socket";
            continue;
        }
        if (getnameinfo(res->ai_addr, res->ai_addr->sa_len,
            hostname, NI_MAXHOST, servname, NI_MAXSERV,
            NI_NUMERICHOST | NI_NUMERICSERV) < 0 ) {
            err(1, "getnameinfo");
        } else {
            printf("connecting to %s port %s...\n", hostname, servname);
        }
        if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
            cause = "connect";
            close(s);
            s = -1;
            continue;
        }

        break;
    }
    if (s < 0) {
        err(1, cause);
    } else {
        char buff[256];
        memset(buff, 0, sizeof(buff));

        if (recv(s, buff, 256, 0) < 0) {
            err(1, "recv");
        }
        printf("%s\n", buff);
    }
    freeaddrinfo(res0);

    return 0;
}

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