栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

远程主机强迫关闭了一个现有的连接。在 System.Net.Sockets.Socket.ReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, So

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

远程主机强迫关闭了一个现有的连接。在 System.Net.Sockets.Socket.ReceiveFrom(Byte[] buffer, Int32 offset, Int32 size, So

远程主机强迫关闭了一个现有的连接。
   在 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

Socket做UDP通讯,怎么也会报错:远程主机强迫关闭了一个现有的连接。

远程主机强制关闭现有连接

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906921.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号