【问题标题】:Networkdevice Identification C#网络设备识别 C#
【发布时间】:2020-04-09 00:59:06
【问题描述】:

在我的 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 并使用了我在这里找到的修改后的 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 还是我所拥有的任何其他想法组合,我都得到了相同的结果。

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

感谢任何想法,因为我真的不知道还有什么可以尝试才能完成这项工作。

【问题讨论】:

  • 你为什么使用 2 计数?听起来你失败了,所以你增加了计数。 Ping 应该始终以 1 计数。所以听起来你的 Ping Time Out 太小了。您还可能有路由循环,导致结果不可靠。检查你的接口掩码。 Ping 是使用 IP 还是计算机名称。如果您使用的是名称,则用于从名称中获取 IP 的 DNS 服务器不会快速返回结果。
  • ".Net Framework 2.7.2" - 没有这样的东西,据我所知(如果有的话,它已经过时了大约十年并且不受支持)。首先,弄清楚你实际使用的是什么。
  • @jdweng 好吧,在这种情况下,我想看看它是否无限重叠是问题所在。我认为这个标准的 ping 超时非常高,所以这绝对不是这里的问题。所有网络设置都很好,我总是手动检查 ping
  • @Damien_The_Unbeliever 修复了它。

标签: c# .net ping


【解决方案1】:

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

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 类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2021-07-27
    • 2013-08-07
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多