2017-03-17 12 views
1

DatagramChannelsを使用してJavaでマルチスレッドUDPプロキシを作成しました。Java:リセットによるネットワーク接続の切断

次の例外が表示されるまで、それは正常に動作します:

java.net.SocketException: Network dropped connection on reset: no further information 
at sun.nio.ch.DatagramChannelImpl.receive0(Native Method) 
at sun.nio.ch.DatagramChannelImpl.receiveIntoNativeBuffer(Unknown Source) 
at sun.nio.ch.DatagramChannelImpl.receive(Unknown Source) 
at sun.nio.ch.DatagramChannelImpl.receive(Unknown Source) 
at com.fabio.rotumaster.proxy.ProxyMain.handlePacket(ProxyMain.java:189) 
at com.fabio.rotumaster.proxy.ProxyMain.run(ProxyMain.java:169) 
at java.lang.Thread.run(Unknown Source) 

ProxyMain.javaではライン189上で呼び出されている受信方法しかない。

SocketAddress sender = this.clientChannel.receive(buffer); 

は、エラーが時間からにランダムに表示されます時間。時にはたった1回、時には5回連続している。

アイデアはありますか?

+0

タイムアウトはありますか? – Fildor

+0

clientChannelがメインチャネルであり、例外が発生したときに〜10個のクライアントが~50パケット/秒を送信していました。これはDatagramChannelのタイムアウトにはなり得ません – modsfabio

+0

DatagramChannelは読み取りタイムアウトをサポートしていないという事実を知りました。 – Fildor

答えて

1

これはWinsock error 10052: WSAENETRESETです:

ネットワークがリセットの接続を落としました。

操作が進行中にキープアライブアクティビティで障害が検出されたため、接続が切断されました。すでに失敗した接続に対してSO_KEEPALIVEを設定しようとすると、setsockoptによって返されることもあります。あなたはおそらくUDPソケットにそれを取得できますか

謎が、MSDN also says under recvfrom()ように見える:データグラムソケットの場合

、このエラーは生きるための時間が経過したことを示しています。

そして@David Schwartzは言う:

これはUDPの実装が無駄にアプリケーションに報告する傾向があり、多くのエラーのいずれかです。あなたはそれらをすべて無視する必要があります。

関連する問題