网络设备标识 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。
在我的 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。