网络设备标识 C#

Networkdevice Identification 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 class 和随后的 PingReply class,据我所知,两者在任何地方都没有 "source ip" 选项。

我构建了一个 Ping Wrapper 并使用了我在此处找到的修改后的 PingReply class https://www.codeproject.com/Questions/828234/Ping-over-specific-Interface-with-IcmpSendEchoEx?loginkey=false

不过,对于我的用例来说,这两者都有一个致命缺陷。 当接口或目的地(还)不存在时,我继续与他们 ping 时。 我随机得到错误的结果。 IE。如果我提前开始 ping 并且 Ping 继续运行,它可能会随机给我一个 "succesfull Ping from 0.0.0.0".

我的代码看起来像这样:

        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 还是我的任何其他想法组合,我都得到了相同的结果。

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

感谢任何想法,因为我真的不知道要尝试其他什么才能使这项工作成功。

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

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

}

我知道我实际上不需要检查来源,但这似乎更能减少误差幅度 w/e。

使用前面提到的 PingReply class。