首页 > 解决方案 > udpclient.receive() 突然停止接收

问题描述


UdpClient用来从单个主机接收数据(实际上它是一个微控制器,每 4 毫秒发送 32 个字节的数据。
我编写的程序非常简单。
我正在初始化UdpClient这样的(在 Program.cs 中):

public static UdpClient client = new UdpClient(1414);

之后我在 Form_Load 事件中执行此操作:

static UdpClient client = Program.client; 
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

然后client.Recieve()像这样调用:

                Task.Run(() =>
                {
                    while (true)
                    {                       
                        try
                        {
                            data = client.Receive(ref RemoteIpEndPoint);                            
                        }
                        catch (Exception ex)
                        {
                            String err_type = ex.GetType().Name;
                            if (err_type == "SocketException")
                            {                                    
                                MessageBox.Show("Cannot Find The Device.", "Device Error.");
                            }
                        }                                                        
                    }
                });

该程序在我自己的系统上运行良好(使用 Windows 10)。然而,当我在 Windows 7 上随机运行这个程序时,有 100%client.Recieve()的机会停止工作并且程序不再接收任何数据。不抛出异常。为了找到问题的根源,我安装了 Wireshark 来测试是否有任何传入数据。答案是否定的(LAN 端口灯也停止闪烁)。让我感到困惑的是,这不会在 Windows 10 上发生。

标签: c#udpclient

解决方案


问题是,您会错过除 SocketException 之外的所有异常。要找出发生了什么,请重写您的 catch 块:

Task.Run(() =>
                {
                    while (true)
                    {                       
                        try
                        {
                            data = client.Receive(ref RemoteIpEndPoint);                            
                        }
                        catch (SocketException ex)
                        {

                                MessageBox.Show("Cannot Find The Device.", "Device Error.");

                        }  
                        catch (Exception e)
                        {
                                MessageBox.Show(e.GetType().Name, e.Message);
                        }

                    }
                });

推荐阅读