2011-08-09 18 views
2

問題JavaのソケットのDatagramSocketにデータを送信すると、デスクトップのネットワーク・アプリケーションで例外

後に使えなく取得時々exceptiptionが発生します。この例外ソケットが完全に使用不可能である

java.net.SocketException: No buffer space available (maximum connections reached?): Datagram send failed 

後:それはないありません何かを受け取り、send()は無期限にハングします。

この動作は、マシンがスリープモードに移行して戻ってくるときに、Windows上でのみ100%のケースで繰り返すことができます(このソケットは、 "集中的なデータフロー"の途中で。

質問はです:

  1. は、BSDソケットの通常この動作です - エラーの後に使えなく取得するには?それともWSAバグの一種ですか?
  2. 故障したソケットを動作状態に「リセット」する方法はありますか?またはソケットを再オープンする方法は唯一の方法ですか?
  3. 例外をキャッチした後、通常のI/Oエラー(つまり回復可能なもの)とそのような条件を区別することは可能ですか?
  4. 任意の一般的なガイダンス/アドバイスは、(私は意味:ネットワークアドレスは、PCのスリープ/ウェイクアップし、他のイベントを変更)私はアプリケーションでソケットを再開するものとするときにあります

ありがとう! :)

+0

このテストは今、9月に繰り返されていますが、... heh ..例外は引き続き発生しますが、ソケットが使用できなくなることはありません。私。無視してソケット上の通信を進めることができます。私はこの時間中に私のWin7でいくつかの大きなアップデートを見つけました。おそらくMSの人はWSAで何かを修正しました... – tuxSlayer

答えて

1

ソケットは、SocketTimeoutExceptionを除いて例外なく使用できません。

+0

PortUnreachableExceptionもありますが、今すぐチェックすることはできませんが、UDPソケットのためにスローされると思うと、docsは言う: '接続されたデータグラムでICMPポート到達不能メッセージが受信されたことを示す信号。接続されたデータグラムが何であるかを知っている( 'socket'という単語がありませんか?)... – tuxSlayer

+0

@tuxSlayer正解、ありがとう。 PortUnreachableExceptionの後、そのアドレスへの送信を拒否することが賢明であり、ソケットを切断して他のアドレスに送信するために使用することができます。 – EJP

1

私は、ソケットの読み書きが例外がスローされた場合、ソケットがもはや使用できないと想定するのは安全だと思います。このような状況では、どのような回復可能なI/Oエラーが予想されますか?

+0

UDPデータグラムを送信中に何か "Port Unreachable" ICMPメッセージが出るかもしれません... ? :) – tuxSlayer

+0

いいえ、私はそれを期待しません。 UDPデータグラムを送信すると、パケットが受信された場合は確認応答も受信者アドレスに到達できない場合はエラー報告もありません。 – jarnbjo

+0

ええ、私はudpが信頼できないと知っていますが、一部のホスト/ネットワークからはこのエラーが発生します。さらに、ネイティブコード用のBSDソケットAPIは、そのようなケース(ホスト到達不能、ネットワーク到達不能)のエラーコードを定義することさえできます...さらに、エラー状態はローカルホスト上で検出される可能性があります。正直言って、私はJavaソケットからのそのようなエラーを覚えていませんが、ネイティブコードではそのようなエラーを無視するか、回復可能なものとして処理します。 – tuxSlayer

関連する問題