首页 > 解决方案 > 网络设备识别 C#

问题描述

在我的 C# WPF 程序中,我目前正在研究一个非常明确的问题的解决方案。该程序旨在使用包含大约 15-25 个 USB 以太网适配器的 US-Hub 配置特定网络设备。我已经完成了上述适配器的配置,现在我想在我更改 IP 地址后检查上述设备是否可 ping。

如果我们192.168.1.254将地址视为我的网络设备现在都拥有的地址,并将192.168.1.100-105 其视为我的以太网适配器的地址范围。使用 Windows 命令提示符,这很容易检查。我会做
ping 192.168.1.254 /S 192.168.1.100...

我想使用 .Net Framework 4.7.2 在 C# 中执行此操作

我对此进行了多次尝试,因为据我所知,Ping 类和以下 PingReply 类在任何地方都没有“源 ip”选项。

我构建了一个 Ping Wrapper 并使用了我在这里找到的 Modified PingReply 类https://www.codeproject.com/Questions/828234/Ping-over-specific-Interface-with-IcmpSendEchoEx?loginkey=false

不过,这两个对我的用例来说都有一个致命的缺陷。当接口或目的地(尚)不存在时,当我继续与他们进行 ping 操作时。我随机得到错误的结果。IE 如果我提前开始 ping 并且 Ping 继续运行,它可能会随机给我一个“从 0.0.0.0 成功 Ping”。

我的代码看起来像这样:

        internal Task<bool> CheckPing(IPAddress src, IPAddress dest, NetworkInterface iFace) => Task.Run( async() =>
        {
            IPAddress source = src;
            IPAddress destination = dest;
            NetworkInterface networkInterface = iFace;
            var rightView = views.Find(view => view.NetworkIface.GetPhysicalAddress().ToString() == networkInterface.GetPhysicalAddress().ToString());
            int cnt = 0;
            wanted = true;
            while (wanted && cnt < 2)
            {
                Thread.Sleep(100);
                if (networkInterface.OperationalStatus == OperationalStatus.Up)
                {
                    var x = await Task.Run(() => WpfForm.PingReply.Send(source, destination));

                    if (x.Status == IPStatus.Success)
                    {
                        rightView.SomethingConnected = true;
                        return true;
                    }
                    else
                    {
                        cnt++;
                    }
                    Thread.Sleep(1000);
                }
                else
                {
                    Debug.WriteLine("Nothing is connected to this interface");
                    rightView.SomethingConnected = false;
                }
            }
            rightView.SomethingConnected = false;

            return false;
        });

在这种情况下,它使用了我链接的覆盖的 PingReply 方法。但无论是使用 Windows 中的实际 PING.EXE 还是我所拥有的任何其他想法组合,我都得到了相同的结果。

问题在于,在我的用例中,这不能是随机的,如果开关连接到此接口,我必须对我的问题有明确的答案。

任何想法都会受到赞赏,因为我真的不知道还要尝试什么才能完成这项工作。

标签: c#.netping

解决方案


我仍然不知道为什么会发生这种情况,但这似乎正在解决它!

var x = await Task.Run(() => WpfForm.PingReply.Send(source, destination , 2500));
if (x.IpAddress.ToString() == destination.ToString() 
      || x.IpAddress.ToString() == source.ToString())

{

   // Do other stuff

}

我知道我实际上并不需要检查来源,但这似乎更能最大限度地减少误差范围。

使用前面提到的 PingReply 类。


推荐阅读