2017-03-17 152 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实现往往会白白给应用程序报告之一。你几乎不得不忽视它们。

相关问题