|
はじめまして。 kaoriと申します。 Perl言語を勉強中です。 非常に参考になる情報をありがとうございます。 いつも感心しながら参考に勉強させてもらっています。 どうしてもわからないので教えてください。 Socketの使い方はなんとなく判ったのですが、IPv6のSocketはどういうふうに すればよいのでしょうか? Socket6っていうのをインストールしてみましたが、よくわかりません。。 私の環境は、FreeBSD-RELEASE4.1に、Perl5です。 こんな感じで作っていて、IPv4ではちゃんと動作しています。 $port = getservbyname($port_no,'tcp') || $port_no; $socket = IO::Socket::INET->new(PeerAddr => 127.0.0.1, PeerPort => 80, Proto => 'tcp', ); ご助言、よろしくお願いいたします。 |
|
>>1659 kaori - IPv6 環境が構築してあるか。ping6 コマンドを使って IPv6 で反応が返ってくるか (localhost 宛でもよい)。 - perl が IPv6 に対応しているかどうか。perl-5.005_03 なら多分 無理。5.6 か 5.7 で対応したかもしれません。Socket6 というのを 使えば 5.005_03 でもいけるのかもしれませんが、僕は試したことが ありません。 それをクリアすれば、少しの例外を除いて基本的には書き方は同じです (そうしないとソースレベルでの互換性が全くなくなるので)。例外と いうのは gethostbyname の代わりに getaddrinfo を使うとか。 とりあえず perldoc Socket6 してみてください。サンプルの ひとつでも載っているのではないでしょうか。 |
|
>>1660 68user > 少しの例外を除いて基本的には書き方は同じです (そうしないと > ソースレベルでの互換性が全くなくなるので)。例外というのは > gethostbyname の代わりに getaddrinfo を使うとか。 あー激しく不正確だなぁ。gethostbyaddr で IPv6 なプログラムは 書けます。でも、AF_INET を AF_INET6 にしないといけないとか、 struct sockaddr_in を struct sockaddr_in6 にするだとか、 ソースレベルでの書き換えが必要になります。しかもそのように 書き換えると IPv4 では動きません。 そりゃまずいというわけで、IPv4 でも IPv6 でも同じ書き方が できるような新しいライブラリが追加されました。getaddrinfo という関数や AF_UNSPEC というアドレスファミリ (AF_INET とか AF_INET6 とかを指定する必要がない) などなど。 というわけで、IPv6 only のプログラムは簡単に書けますが、 書いちゃいけません。IPv4/v6 両方で動くようなプログラムを 作るべきです。 あと、FreeBSD 4.1-RELEASE のデフォルト状態なら IPv6 対応の はずですね。/etc/inetd.conf の #echo stream tcp6 nowait root internal あたりを有効にして inetd を再起動して、それとお話しする クライアントを書いてみるといいでしょう。 以上、IPv6 アプリを書いたことのない者 (IPv6 を使ったことさえ ない) のたわごとでした。 |
|
しつこくて失礼。perl5.005_03 に Socket6 モジュールを入れてみました。 >>1660 68user > とりあえず perldoc Socket6 してみてください。サンプルの > ひとつでも載っているのではないでしょうか。 ばっちり載ってますね。これをちょいといじって % netstat -a | grep tcp6 | grep echo tcp6 0 0 *.echo *.* LISTEN なサーバにつなげようとしたら、 Can't load '/home/68user/p5-module/i386-freebsd/auto/Socket6/Socket6.so' for module Socket6: /home/68user/p5-module/i386-freebsd/auto/Socket6/Socket6.so: Undefined symbol "in6addr_any" at /usr/local/lib/perl5/5.00503/i386-freebsd/DynaLoader.pm line 169. だそうで。原因究明はまた後日…と言いたいところだけれど、 こりゃ僕のレベルではいかんともしがたいですな。 |
|
あーしつこい。でも初 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 です。 |
|
> この画面なのですが、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アドレス] でうまくいくなら、それで結果オーライにしてしまってよいのではないでしょうか。 |