From: "中田雅美" Date: 2007-08-01T18:15:07+09:00 Subject: [ruby-list:43770] Re: UDP通信時のエラー検出 中田(雅)です。 小西様、神戸様、返信ありがとうございます。 ソケット通信について知識不足でご迷惑おかけします。 UDPが投げっぱなしという認識はあるのですが、 RubyのマニュアルにはSocket#connect について、 「connect(2)と同じ働きをします。(中略)0 を返します。」とありました。 神戸様のコメントにありますように、connect(2)を使っているのであれば ICMPエラーを送信側で判別できるのではと思った次第です。 ただ、「0 を返します。」ということは、やはり固定なのかもしれません。 また、UDPSocket#send については、 「データの送信に失敗した場合は例外 Errno::EXXX が発生します。」 とありましたが、 私の期待している「ポートが閉じているときにエラー」にはならないようです。 ここで言うデータ送信失敗がどのような状況を指しているのかも ご存知の方がいらっしゃいましたら教えていただきたいです。 > In message <6DC7D411CB0FB4konishi@raax.co.jp> > on Wed, 1 Aug 2007 16:59:01 +0900, > 小西 弘将 wrote: > > TCPと異なり、UDPは送信エラー等をチェックしないので、アプリケーションレベ > > ルで対応するしかないのでは無いでしょうか。 > socketなインターフェイスで、connect(2)したUDPのソケットだと、ちょっと > だけ気を効かせてくれます。(何度もconnect(2)できるとかもありますが。) > > RubyのSocketクラスで、それをどのようにしているかは知りませんので、 > 以下は生のUNIXなシステムレベルの話となります。 > > > >同一ネットワーク上のマシンへ UDP パケットを送信した際に、 > > >ポートが閉じている、接続できないなどのエラーを > > >検出する方法が分かりません。 > 接続という概念はUDPにはないので、「接続できない」エラーは基本的にあり > ません。例外として、オペレーティング・システムに何らかのリソースが足り > なくて、connect(2)が失敗した場合のエラーは検出できるでしょう。 > > また、connect(2)したUDPのソケットだと、ICMPのport unreachable等が返っ > てきた場合に、次の送信の処理でエラーを返してくれます。 > > 繰り返しますが、以上はシステムコールのレベルの話で、RubyのSocketライブ > ラリでどのように扱われているかはわかりません。 > > -- > 神戸 隆博(かんべ たかひろ) at 仕事場 > >