远程主机强迫关闭了一个现有的连接。
在 System.Net.Sockets.Socket.ReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint& remoteEP)
在 System.Net.Sockets.UdpClient.Receive(IPEndPoint& remoteEP)
最近搞WPF开发,其中遇到一个奇怪的异常:在本地测试仅运行客户端程序不会挂掉,但是一放到服务器上面只运行客户端程序就出问题了,当时就懵逼了,首先想到的办法是使用dnSpy进行调试,最后将问题锁定在了udpClient.Receive方法上面,网上说这个Windows的一个bug
通过上面的图片可以猜测:由于向某个地址发送了一个数据包后,在接受数据包上面除了问题,即这个数据包有问题,通过抓包工具可知返回的数据包为ICMP类型 (路由器在转发数据包不成功时就会发回地址不可到达ICMP包) 的,这种类型的数据包会导致UDP套接字抛异常
解决方案如下:
public UdpPackage Receive()
{
try
{
UdpPackage udpPackage = new UdpPackage();
/*解决问题的核心代码*/
int SIO_UDP_CONNRESET = -1744830452;
udpClient.Client.IOControl(
(IOControlCode)SIO_UDP_CONNRESET,
new byte[] { 0, 0, 0, 0 },
null
);
/*解决问题的核心代码*/
udpPackage.bytes = udpClient.Receive(ref udpPackage.iPEndPoint);
return udpPackage;
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message + Environment.NewLine + ex.StackTrace);
return Receive();
}
}
public class UdpPackage
{
public byte[] bytes;
public IPEndPoint iPEndPoint;
public UdpPackage()
{
iPEndPoint = new IPEndPoint(IPAddress.Any, 0);
}
}
参考文章:
C# UDP An existing connection was forcibly closed by the remote host