2017-03-17 155 views
1

我使用DatagramChannel在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); 

從時間隨機出現的錯誤時間。有時只有一次,有時連續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實現往往會白白給應用程序報告之一。你幾乎不得不忽視它們。