68user's page 掲示板

Prev< No. 1663〜1668> Next  [最新発言に戻る] [過去ログ一覧]
No. 1663 # 68user 2001/01/25 (木) 22:04:27
あーしつこい。でも初 IPv6 体験の記念に (やってることは
しょぼいなぁ)。

4.1-RELEASE あたりなら、telnet も IPv6 ready なので、
    % telnet ::1 echo
で IPv6 で localhost の echo サーバとお話できます。
netstat で tcp6 なコネクションが張られていること、
tcpdump で IPv6 なデータグラムが流れていることを
確認してください。
    % tcpdump -i lo0
    21:56:30.055419 localhost.1206 > localhost.echo: . ack 5 win 57344 (DF) [tos 0x10]
            4510 0028 0eca 4000 4006 2df4 7f00 0001
            ...
    21:54:41.404023 localhost.1204 > localhost.echo: S 705795707:705795707(0) win 16384 <mss 16324>
            6000 0000 0018 0640 0000 0000 0000 0000
            ...
先頭1バイトが4なのが IPv4、6 が IPv6 です。

No. 1664 # gixs 2001/01/25 (木) 22:09:21
> この画面なのですが、AIXのバージョンが4.2.1の為に
> smitty mkclientで表示される画面が、
> 「* NIS クライアントを開始する時期両方」
> しか、表示されないのです

確認しました。
となると、ブロードキャストでNISサーバを見つけるはずですね。

> >ypcat passwdが応答の無い時、
> >ping [NISサーバのホスト名]
> >の応答はあるのでしょうか?
> 試して見たのですが、応答ありませんでした。

ローカルの/etc/hostsにNISサーバのエントリがあっても、応答無しですか?

あまり引き延ばして、却って失望が大きくなってしまうのが辛いので、
状況をまとめます。

/etc/hostsにNISサーバのエントリがあるとして、

1. ping [NISサーバのホスト名]が応答なし
少しだけ脈あり。名前解決の順序がおかしいようです。
FAQの1.800(http://www.landfield.com/faqs/aix-faq/part3/)
にありますが、環境変数NSORDERがあるとか?(可能性は低いですが)

2. ping [NISサーバのホスト名]が応答あり
今さら、この結論も気が引けますが、
ypwhich [NISサーバのIPアドレス]
でうまくいくなら、それで結果オーライにしてしまってよいのではないでしょうか。

No. 1665 # kaori [E-mail] 2001/01/26 (金) 09:28:12
  kaoriです。

  ご丁寧な回答ありがとうございました!
IPv6の環境は整っています(OCNの実験に参加しています)ので、
教えて頂いたのを参考に色々試してみます!

> というわけで、IPv6 only のプログラムは簡単に書けますが、
> 書いちゃいけません。IPv4/v6 両方で動くようなプログラムを
> 作るべきです。

  本当にその通りですね。 アドバイスありがとうございます。

  今後もよろしくお願いします!

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;
}

No. 1667 # rosegarden 2001/01/26 (金) 16:38:08
>>1666 rosegarden
> なんか、FreeBSD の /usr/bin/perl は IPv6 に対応してない感じですね。
> 4-stable も 5-current(こちらは perl 5.6.0)も試しました。
> perldoc Socket6 して出て来る IPv6 の daytime のサンプルを試しましたが、
> socket: Protocol not supported
> などというエラーを返します。

原因が分かりました。ああ、余計なポストするんじゃなかったな。
FreeBSD の /usr/bin/perl はちゃんと IPv6 対応していますね。
私の場合 ports で Socekt6 インストールしたのですが、ちゃんと動きました。

ところで、Socket6.pm 持っている人は、サンプルが次のようになっていませんか?

use Socket;
use Socket6;

@res = getaddrinfo('hishost.com', 'daytime', 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 port $port...\n";

        socket(Socket_Handle, $family, $saddr, $proto) || next;
(以下略)

投稿した C プログラム眺めていて気がついたのですが、
        socket(Socket_Handle, $family, $saddr, $proto) || next;
って
        socket(Socket_Handle, $family, $socktype, $proto) || next;
のミスじゃありませんか?

# なんで投稿した直後に気が付くんだろう。
# 私の勘違いかなぁ? 最近ぼけているし...。

ちなみに、私の場合次のようにしたら、スクリプトはうまく動きました。
環境は 4-stable + perl 5.00503 + Socket6 です。

#!/usr/bin/perl
use Socket6;
use Socket;

@res = getaddrinfo('localhost', 'daytime', 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 port $port $family...\n";

    socket(Sock, $family, $socktype, $proto) || die "socket: $!";
    connect(Sock, $saddr) && last;

    close(Sock);
    $family = -1;
}
if( $family != -1 ){
    print "connected to $host port $port\n";
    while( defined($line = <Sock>) ){
        print "$line\n";
    }
    close(Sock);
}
exit;

# 穴があったら入りたいです。

No. 1668 # rosegarden 2001/01/26 (金) 17:10:37
>>1667 rosegarden
そうだ。補足です。下のスクリプトですが、
> socket(Sock, $family, $socktype, $proto) || die "socket: $!";
この部分の die 云々のところは next にして
> socket(Sock, $family, $socktype, $proto) || next;
とすると IPv6/IPv4 の daytime クライアントになります。私の場合には
最初から、/etc/rc.conf に ipv6_enable="YES" が入っているのと、
デバッグの意味もあって、上の die を入れておいただけです。

socket の三番目の引数は SOCK_STREAM とかそういうのが入ります。
私がはまったのは、サンプルをコピー & ペーストして書き換えたものを
使っていたからです。CPAN にある Socket6 は直っているかも知れません。
(でも、ダウンロードしたのは昨日の夕方ですが。)

# コピー & ペーストなんて、安直なことしたバチがあったんですね。

上のように直して、inetd.conf で IPv4 の方だけ有効にしておくと
% perl daytime6.pl
Trying to connect to ::1 port port 13...
Trying to connect to 127.0.0.1 port port 13...
connected to 127.0.0.1 port 13
Fri Jan 26 16:59:50 2001

という感じで、IPv6 が有効だと
% perl daytime6.pl
Trying to connect to ::1 port port 13...
connected to ::1 port 13
Fri Jan 26 17:01:16 2001

になります。IPv6 見てから、IPv4 見ると言うのは、システムによっては
変わるのでしょうか? とりあえず、うちの場合は telnet も ftp もこの順番です。

# しかし、なぜ投稿してから気がつくんだろう??
# 68user 様ならびに皆様、再三のゴミ書き申し訳ありません。

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