我有一个C#应用程序,只能在网络关闭时使用,但我担心用户只需拔掉网线就可以使用它。
有没有办法检测网络电缆是否已拔下?
由于
答案 0 :(得分:6)
您可以使用IsNetworkAlive()。虽然从技术上讲它不会检查链路状态,但它可能更好,因为它也可以检测无线和拨号连接。这是一个例子:
using System.Runtime.InteropServices;
class Program
{
[DllImport("sensapi.dll")]
static extern bool IsNetworkAlive(out int flags);
static void Main(string[] args)
{
int flags;
bool connected = IsNetworkAlive(out flags);
}
}
flags param返回连接是互联网还是LAN。我不是100%确定它是如何知道的,但我敢打赌它只是看看是否有默认的网关设置。
答案 1 :(得分:4)
在我看来,没有一定的方法来区分网络连接和不插电缆。即使有办法,也有办法解决它。
让我们假设您有一个解决方案,让我们看看一些情况:
答案 2 :(得分:3)
您可以使用此
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
答案 3 :(得分:2)
某些网络驱动程序能够来检测此问题。但是,您需要使用非托管代码从C#访问它们(这可能非常困难/不可能),并且该解决方案可能对所有网络适配器都不可靠。
答案 4 :(得分:1)
网卡会将此状态报告为状态。像ethtool
这样的工具可以显示这个(Link up
),但这只适用于Linux / Unix。
如果您可以使用Windows API枚举已安装的网卡,我相信您会在那里找到“链接”的标记。
答案 5 :(得分:1)
您可以将代理人注册到NetworkChange
班级。当网络发生变化时,它实际上并不会通知您发生了什么,因此您可以列出所有网络接口(使用NetworkInterface
),过滤与您有关的接口(通过检查其属性)并检查其运行状态
答案 6 :(得分:0)
如果我真的想要使用你的应用程序,它是否会起作用取决于这样的东西,我总能找到一种方法来欺骗你的应用程序。你确定没有更好的解决方案吗?
答案 7 :(得分:0)
ping默认网关怎么样?
有一些代码here从注册表中获取默认网关。
答案 8 :(得分:0)
To detect 'Is network cable plugged in a machine?', below piece of code works.
class Program
{
private static void Main(string[] args)
{
bool isNetworkCableConnected = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
}
}