c# - 网络设备识别 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 还是我所拥有的任何其他想法组合,我都得到了相同的结果。
问题在于,在我的用例中,这不能是随机的,如果开关连接到此接口,我必须对我的问题有明确的答案。
任何想法都会受到赞赏,因为我真的不知道还要尝试什么才能完成这项工作。
解决方案
我仍然不知道为什么会发生这种情况,但这似乎正在解决它!
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 类。
推荐阅读
- java - Anylogic - 在启动时通过控制编辑框更改资源集数量
- python - Kivy Popup 出现在函数运行之后而不是之前
- android - 如何在导航抽屉中将菜单与列表视图结合起来?
- python - 减少 Matplotlib 中面积图中的 x 轴条目
- android - 在 Flutter 本地通知中调用 HTTP 请求
- azure - 如何从 AAS 模型中解决此数据网关错误?
- ios - iOS TrueDepth 帧到点云
- python - Django:ORA:01461:只能绑定 LONG 值以插入 LONG 列
- javascript - 如何在指定数组中推送 null
- selenium - 我为 selenium chrome 驱动程序设置了代理,但流量仍然来自我在 java 中的本地