【发布时间】: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 修复了它。