如何判断网络电缆是否已拔下?

时间:2009-05-20 07:55:48

标签: c# networking

我有一个C#应用程序,只能在网络关闭时使用,但我担心用户只需拔掉网线就可以使用它。

有没有办法检测网络电缆是否已拔下?

由于

9 个答案:

答案 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)

在我看来,没有一定的方法来区分网络连接和不插电缆。即使有办法,也有办法解决它。

让我们假设您有一个解决方案,让我们看看一些情况:

  • 没有网络流量,电缆未从计算机上拔下:它可能在另一端拔掉。
  • 没有网络流量,电缆已拔下:但情况一直如此,笔记本电脑通过Wi-Fi连接,目前已关闭。
  • 有几个网络接口,只有连接到WAN的网络接口关闭:你的应用程序应该工作吗?
  • 从某种意义上说,网络实际上是关闭的:有人设法连续重启路由器以使用你的应用程序。

答案 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)

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();
    } 
}

答案 7 :(得分:0)

如果我真的想要使用你的应用程序,它是否会起作用取决于这样的东西,我总能找到一种方法来欺骗你的应用程序。你确定没有更好的解决方案吗?

答案 8 :(得分:0)

ping默认网关怎么样?

有一些代码here从注册表中获取默认网关。