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

6

我有一个C#应用程序,只有在网络断开连接时才可以使用,但我担心用户会直接拔掉网络电缆来使用它。

是否有一种方法可以检测网络电缆是否已被拔出?

谢谢


网络断开和电缆拔出有什么区别?如果我拔掉电缆的另一端会怎样? - mouviciel
如果网络出现问题,那没关系。如果我能使用检测到网线已被拔出并显示消息“网络电缆已被拔出”的工具,那就太好了。 - user109793
我认为重点在于,网络故障、您这一端的电缆未插好或另一端的电缆未插好并没有什么区别。 - Stefan Thyberg
有时候,了解电缆是否从实际设备上物理拔出会是理想的情况。例如,在医院中,当对患者进行手术时,非电气隔离网络电缆不应连接到医疗设备上。因此,能够告诉用户在电缆连接时不能继续进行任何操作是一个很好的安全功能。 - derGral
有一个重要区别需要注意,那就是网卡与交换机进行电气连接(交换机本身不会产生任何网络流量),以及网卡未连接到交换机之间的区别。大多数网卡都有灯光指示器来显示连接状态。我相信提问者想了解的就是如何检测连接状态。通常情况下,网络故障发生是由于某些服务器停止响应,而不是电气连接中断造成的。 - Ian Goldby
显示剩余2条评论
9个回答

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参数返回连接是互联网还是本地局域网。我不确定它如何知道,但我敢打赌它只是查看是否设置了默认网关。


谢谢,我认为这是最接近的解决方案了,考虑到所有的解决方法。 - user109793

4
在我看来,没有确切的方法可以区分网络故障和未插电缆。即使有一种方法,也有一种方法可以解决这个问题。
假设你有一个解决方案,让我们看看一些情况:
- 没有网络流量,电缆没有从计算机上拔出:可能在另一端被拔出了。 - 没有网络流量,电缆已经拔出:但这一直是这样,笔记本电脑连接的是此时不可用的 Wi-Fi。 - 有几个网络接口,只有连接到广域网的接口无法使用:应用程序是否应该工作? - 网络实际上是故障的,就像你所说的那样:有人为了使用你的应用程序而不断重启路由器。

没错。许多因素都可能导致您的网络手动关闭。 - Ólafur Waage

3
你可以使用这个。
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

2

一些网络驱动程序能够检测到这一点。然而,您需要使用非托管代码从C#访问它们(这可能非常困难/不可能),并且该解决方案可能对所有网络适配器都不可靠。


有趣... 你有相关的硬件、API等链接吗? - timday
抱歉,我不知道,但是我在英特尔等主要品牌的网卡上看到过这个。 - Alex Angas

1

网络适配器将会把此状态报告出来。例如ethtool这样的工具可以显示这一状态(Link up),但只有Linux/Unix系统才可以使用。

如果您能够通过Windows API列举已安装的网络适配器,我相信您一定能找到“link up”的标记。


1
您可以注册一个委托到NetworkChange类。当网络发生变化时,它实际上不会通知您发生了什么,因此您可以列出所有的网络接口(使用NetworkInterface),过滤掉那些与您相关的接口(通过检查它们的属性),并检查它们的操作状态。

0

要检测“网络电缆是否插入计算机?”,可以使用以下代码片段。

class Program
{
    private static void Main(string[] args)
    {
        bool isNetworkCableConnected = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
    } 
}

0

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


我认为这个应用程序的用户不会费心去尝试“欺骗”它,因为使用它比另一个程序更快。这个应用程序的重点是只在网络故障时使用,这种情况非常罕见。我只需要一种方法来确保用户不会简单地拔掉网络电缆并持续使用它。这些人没有高水平的计算机知识 - 我只需要一个指示,他们已经拔掉了网络电缆,以给出网络故障的假象。 - user109793

0

尝试 ping 默认网关怎么样?

这里有一些代码在这里,可以从注册表中获取默认网关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接