[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-users:22000] Re: error Socket::unpack_sockaddr_in when use Net::Ping
> start!
> Use of uninitialized value at /usr/lib/perl5/5.005/i386-linux/Socket.pm line 295.
> Bad arg length for Socket::unpack_sockaddr_in, length is 0, should be 16
> at /usr/lib/perl5/5.005/i386-linux/Socket.pm line 295.
> -----------------------------
>
> といったエラーが帰ってきてしまいます。
> # ちなみに ping が失敗するホストに向かって実行した時には正常に終了します。
Ping.pmのサブルーチンping_udpの中で、recv の戻り値をそのまま
sockaddr_in に渡しているけど、recvがエラーになって戻り値がundefだった
ため、sockaddr_inのunpackするところでひっかかっています。
ここらのロジックは
指定アドレスのudp/echoポートにパケットを送る
selectで返事を待つ(timeoutあり)
recvして送り主のアドレス/ポートを確認
というふうになってますが、このrecvがエラー(=戻り値undef)だったときの処
理がありません。あやしいのでrecvでエラーだったときは$!を表示するように
して実験したところECONNREFUSEDでした。
127.0.0.1だと自ホストなのでudpのechoに答えるプロセスがないとこのエラー
が見えてしまうということだと思います。(他ホストなら返事がないだけなの
でtimeoutする) 実際、条件を変えて
udpのechoに答えるようにして127.0.0.1
udpのechoに答えない他ホスト
udpのechoに答える他ホスト
の3通りで試しましたがこの問題は出ませんでした。
最終的に自ホストにpingするのが目的ではなくてテストか何かのためやってみ
たらひっかかったんじゃないかと思います。他のホストに向けて使う分には問
題はでないと思いますので、気にしないで進むのが正解かな?? むしろudpの
echoに答えない設定のホストが多そうなのでそっちが問題になりそうな気もし
ます。(手元にpotatoとFreeBSD4.0Rがありますがどっちもインストールした状
態からいじった憶えはないのにinetd.confでコメントアウトされてました)
松井