Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用.NET检查Internet连接的最佳方法是什么?_C#_.net_Internet Connection - Fatal编程技术网

C# 使用.NET检查Internet连接的最佳方法是什么?

C# 使用.NET检查Internet连接的最佳方法是什么?,c#,.net,internet-connection,C#,.net,Internet Connection,在.NET中,检查Internet连接的最快和最有效的方法是什么?您绝对无法可靠地检查是否存在Internet连接我想您指的是访问Internet public static bool CheckForInternetConnection(int timeoutMs = 10000, string url = null) { try { url ??= CultureInfo.InstalledUICulture switch {

在.NET中,检查Internet连接的最快和最有效的方法是什么?

您绝对无法可靠地检查是否存在Internet连接我想您指的是访问Internet

public static bool CheckForInternetConnection(int timeoutMs = 10000, string url = null)
{
    try
    {
        url ??= CultureInfo.InstalledUICulture switch
        {
            { Name: var n } when n.StartsWith("fa") => // Iran
                "http://www.aparat.com",
            { Name: var n } when n.StartsWith("zh") => // China
                "http://www.baidu.com",
            _ =>
                "http://www.gstatic.com/generate_204",
        };

        var request = (HttpWebRequest)WebRequest.Create(url);
        request.KeepAlive = false
        request.Timeout = timeoutMs;
        using var response = (HttpWebResponse)request.GetResponse();
        return true;
    }
    catch
    {
        return false;
    }
}
但是,您可以请求几乎从不离线的资源,比如ping google.com或类似的东西。我认为这将是有效的

try { 
    Ping myPing = new Ping();
    String host = "google.com";
    byte[] buffer = new byte[32];
    int timeout = 1000;
    PingOptions pingOptions = new PingOptions();
    PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
    return (reply.Status == IPStatus.Success);
}
catch (Exception) {
    return false;
}

这是可行的

只需执行web请求、邮件、ftp等操作,并做好请求失败的准备,即使检查成功,您也必须这样做

考虑以下几点:

1 - check, and it is OK
2 - start to perform action 
3 - network goes down
4 - action fails
5 - lot of good your check did
如果网络断开,您的操作将以与ping一样快的速度失败,等等

1 - start to perform action
2 - if the net is down(or goes down) the action will fail

通过ping Google进行互联网连接测试:

new Ping().Send("www.google.com.mx").Status == IPStatus.Success

另一个选项是适用于Vista和Windows 7的网络列表管理器API。MSDN文章。本文中提供了一个下载代码示例的链接,您可以通过该链接执行以下操作:

AppNetworkListUser nlmUser = new AppNetworkListUser();
Console.WriteLine("Is the machine connected to internet? " + nlmUser.NLM.IsConnectedToInternet.ToString());

请确保从COM选项卡添加对网络列表1.0类型库的引用。。。这将显示为网络列表。

我不同意有人这样说:在执行任务之前检查连接有什么意义,因为在检查之后,连接可能会立即丢失。
bool bb = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();

if (bb == true)
    MessageBox.Show("Internet connections are available");
else
    MessageBox.Show("Internet connections are not available");
当然,作为开发人员,我们承担的许多编程任务都存在一定程度的不确定性,但将不确定性降低到可接受的程度是挑战的一部分

我最近在制作一个应用程序时遇到了这个问题,该应用程序包含一个链接到在线互动程序服务器的映射功能。当发现缺乏互联网连接时,将禁用此功能

此页面上的一些响应非常好,但是确实导致了很多性能问题,例如挂起,主要是在缺少连接的情况下

在这些答案和我的同事的帮助下,我最终使用了以下解决方案:

         // Insert this where check is required, in my case program start
         ThreadPool.QueueUserWorkItem(CheckInternetConnectivity);
    }

    void CheckInternetConnectivity(object state)
    {
        if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
        {
            using (WebClient webClient = new WebClient())
            {
                webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache);
                webClient.Proxy = null;
                webClient.OpenReadCompleted += webClient_OpenReadCompleted;
                webClient.OpenReadAsync(new Uri("<url of choice here>"));
            }
        }
    }

    volatile bool internetAvailable = false; // boolean used elsewhere in code

    void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            internetAvailable = true;
            Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
            {
                // UI changes made here
            }));
        }
    }
无法解决检查和运行代码之间的网络故障问题 但这是相当可靠的

NetworkInterface.GetIsNetworkAvailable非常不可靠。只要有一些VMware或其他LAN连接,它就会返回错误的结果。 同样关于Dns.GetHostEntry方法,我只关心在我的应用程序将要部署的环境中是否会阻止测试URL

我发现的另一种方法是使用InternetGetConnectedState方法。 我的代码是

[System.Runtime.InteropServices.DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);

public static bool CheckNet()
{
     int desc;
     return InternetGetConnectedState(out desc, 0);         
}

如果要在网络/连接发生更改时通知用户/采取措施。 使用NLM API:


我不认为这是不可能的,只是不简单

我已经建立了类似的东西,是的,它并不完美,但第一步是必不可少的:检查是否有任何网络连接。Windows Api做得不好,为什么不做得更好呢

bool NetworkIsAvailable()
{
    var all = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
    foreach (var item in all)
    {
        if (item.NetworkInterfaceType == NetworkInterfaceType.Loopback)
            continue;
        if (item.Name.ToLower().Contains("virtual") || item.Description.ToLower().Contains("virtual"))
            continue; //Exclude virtual networks set up by VMWare and others
        if (item.OperationalStatus == OperationalStatus.Up)
        {
            return true;
        }
    }

    return false;
}
这非常简单,但它确实有助于提高检查的质量,特别是当您想要检查各种代理配置时

因此:

检查是否有网络连接,使其真正发挥作用,甚至可能在出现误报时将日志发送回开发人员,以改进网络可用功能 HTTP Ping 在每个服务器上循环使用HTTP ping的代理配置
ping google.com引入了DNS解析依赖项。Pinging8.8.8.8很好,但谷歌离我还有几步之遥。我所需要做的就是在网上找到离我最近的东西

我可以使用Ping的TTL功能Ping hop 1,然后Ping hop 2,等等,直到我从某个可路由地址上的东西得到回复;如果该节点位于可路由地址上,则它位于internet上。对于我们大多数人来说,跃点1将是我们的本地网关/路由器,而跃点2将是光纤连接另一端的第一个点或其他任何点

这段代码对我来说很有用,而且响应速度比这个线程中的其他一些建议更快,因为它正在ping互联网上离我最近的任何东西

使用系统诊断; Net系统; 使用System.Net.NetworkInformation; 使用System.Net.Sockets; 使用System.Threading.Tasks; 公共静态异步任务已连接到Pointernatasync { 常量int maxHops=30; 常量字符串someFarAwayIpAddress=8.8.8.8; //沿着从这里到谷歌的路线继续ping //直到我们找到一个来自可路由地址的响应
对于int-ttl=1;ttl=16&&bytes[1]我已经看到了上面列出的所有选项,检查wither互联网是否可用的唯一可行选项是Ping选项。 导入[DllImportWininet.dll]和System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterface或NetworkInterface类的任何其他变体无法很好地检测网络的可用性。这些方法仅检查是否插入了网线

Ping选项

如果连接可用,请重试 真的

如果连接不可用且网络电缆已插入,则返回false

如果网络电缆未插入,则引发异常

网络接口

如果Internet可用,则返回True

如果Internet不可用且网络电缆已插入,则返回True

如果网络电缆未插入,则返回false

[DllImportWininet.dll]

如果Internet可用,则返回True

如果Internet不可用且网络电缆已插入,则返回True

如果网络电缆未插入,则返回false


因此,在[DllImportWininet.dll]和NetworkInterface的情况下,无法知道internet连接是否可用。

我个人找到了最佳答案,但我添加了一个检查以排除VMWare和其他人设置的虚拟网络

public static bool Isconnected = false;

public static bool CheckForInternetConnection()
{
    try
    {
        Ping myPing = new Ping();
        String host = "google.com";
        byte[] buffer = new byte[32];
        int timeout = 1000;
        PingOptions pingOptions = new PingOptions();
        PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
        if (reply.Status == IPStatus.Success)
        {
            return true;
        }
        else if (reply.Status == IPStatus.TimedOut)
        {
            return Isconnected;
        }
        else
        {
            return false;
        }
    }
    catch (Exception)
    {
        return false;
    }
}

public static void CheckConnection()
{
    if (CheckForInternetConnection())
    {
        Isconnected = true;
    }
    else
    {
        Isconnected = false;
    }
}
public static bool IsAvailableNetworkActive()
{
    // only recognizes changes related to Internet adapters
    if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) return false;

    // however, this will include all adapters -- filter by opstatus and activity
    NetworkInterface[] interfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
    return (from face in interfaces
            where face.OperationalStatus == OperationalStatus.Up
            where (face.NetworkInterfaceType != NetworkInterfaceType.Tunnel) && (face.NetworkInterfaceType != NetworkInterfaceType.Loopback)
            where (!(face.Name.ToLower().Contains("virtual") || face.Description.ToLower().Contains("virtual")))
            select face.GetIPv4Statistics()).Any(statistics => (statistics.BytesReceived > 0) && (statistics.BytesSent > 0));
}
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
    System.Windows.MessageBox.Show("This computer is connected to the internet");
}
else
{
    System.Windows.MessageBox.Show("This computer is not connected to the internet");
}

对于我的应用程序,我们还通过下载小文件进行测试

string remoteUri = "https://www.microsoft.com/favicon.ico"

WebClient myWebClient = new WebClient();

try
{
    byte[] myDataBuffer = myWebClient.DownloadData (remoteUri);
    if(myDataBuffer.length > 0) // Or add more validate. eg. checksum
    {
        return true;
    }
}
catch
{
    return false;
}
还有。一些ISP可能使用中间服务器来缓存文件。添加随机未使用的参数例如。 可以防止缓存。

它是如何在Android中实现的

作为概念证明,我将此代码翻译为C:

var request = (HttpWebRequest)WebRequest.Create("http://g.cn/generate_204");
request.UserAgent = "Android";
request.KeepAlive = false;
request.Timeout = 1500;

using (var response = (HttpWebResponse)request.GetResponse())
{
    if (response.ContentLength == 0 && response.StatusCode == HttpStatusCode.NoContent)
    {
        //Connection to internet available
    }
    else
    {
        //Connection to internet not available
    }
}

我有三个互联网连接测试

 if (NetworkInterface.GetIsNetworkAvailable() &&
     new Ping().Send(new IPAddress(new byte[] { 8, 8, 8, 8 }),2000).Status == IPStatus.Success)
 //is online
 else
 //is offline
参考System.Net和System.Net.Sockets 添加以下测试功能: 测试1

测试2

测试3

执行测试

如果您制作了一个名为CheckList的字符串和布尔值字典,您可以将每个测试的结果添加到CheckList中

现在,使用for…each循环递归每个KeyValuePair


如果检查表中的值为true,则您知道存在互联网连接。

我对3g路由器/调制解调器上的这些方法有异议,因为如果互联网断开,路由器会将页面重定向到其响应页面,因此您仍然会收到一个steam,并且您的代码认为存在互联网。
 if (NetworkInterface.GetIsNetworkAvailable() &&
     new Ping().Send(new IPAddress(new byte[] { 8, 8, 8, 8 }),2000).Status == IPStatus.Success)
 //is online
 else
 //is offline
苹果或其他有一个热点DeDeDiction页面,它总是返回特定的响应。下面的示例返回成功响应。因此,您将确切地确定您可以连接到internet并获得真正的响应

public static bool CheckForInternetConnection()
{
    try
    {       
        using (var webClient = new WebClient())
        using (var stream = webClient.OpenRead("http://captive.apple.com/hotspot-detect.html"))
        {
            if (stream != null)
            {
                //return true;
                stream.ReadTimeout = 1000;
                using (var reader = new StreamReader(stream, Encoding.UTF8, false))
                {
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {
                        if (line == "<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>")
                        {
                            return true;
                        }
                        Console.WriteLine(line);
                    }
                }

            }
            return false;
        }
    }
    catch
    {

    }
    return false;
}
ping的多线程版本:

用于监视网络状态和internet连接

 if (NetworkInterface.GetIsNetworkAvailable() &&
     new Ping().Send(new IPAddress(new byte[] { 8, 8, 8, 8 }),2000).Status == IPStatus.Success)
 //is online
 else
 //is offline
样本:


尝试通过捕获异常来避免测试连接。因为我们真的希望有时我们可能会失去网络连接

 if (NetworkInterface.GetIsNetworkAvailable() &&
     new Ping().Send(new IPAddress(new byte[] { 8, 8, 8, 8 }),2000).Status == IPStatus.Success)
 //is online
 else
 //is offline
导言

在某些情况下,您需要在windows应用程序中使用C代码检查internet是否可用。可能是在windows窗体中使用internet下载或上载文件,或者从远程位置的数据库获取一些数据,在这些情况下,必须进行internet检查

有一些方法可以使用C从代码隐藏中检查internet可用性。这里解释了所有这些方法,包括它们的局限性

InternetGetConnectedStatewininet “wininet”API可用于检查本地系统是否具有活动的internet连接。用于此操作的命名空间为“System.Runtime.InteropServices”,并使用DllImport导入dll“wininet.dll”。在此之后,创建一个带有extern static的布尔变量,函数名为InternetGetConnectedState,带有两个参数description和reservedValue,如示例所示

注意:extern修饰符用于声明外部实现的方法。当您使用互操作服务调用非托管代码时,extern修饰符的常见用法是DllImport属性。在这种情况下,该方法还必须声明为静态

接下来创建一个名为“IsInternetAvailable”的布尔方法。这个 上述函数将用于此返回internet的方法 本地系统的现状

GetIsNetworkAvailable 以下示例使用GetIsNetworkAvailable方法确定网络连接是否可用

public static bool Isconnected = false;

public static bool CheckForInternetConnection()
{
    try
    {
        Ping myPing = new Ping();
        String host = "google.com";
        byte[] buffer = new byte[32];
        int timeout = 1000;
        PingOptions pingOptions = new PingOptions();
        PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
        if (reply.Status == IPStatus.Success)
        {
            return true;
        }
        else if (reply.Status == IPStatus.TimedOut)
        {
            return Isconnected;
        }
        else
        {
            return false;
        }
    }
    catch (Exception)
    {
        return false;
    }
}

public static void CheckConnection()
{
    if (CheckForInternetConnection())
    {
        Isconnected = true;
    }
    else
    {
        Isconnected = false;
    }
}
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
    System.Windows.MessageBox.Show("This computer is connected to the internet");
}
else
{
    System.Windows.MessageBox.Show("This computer is not connected to the internet");
}

根据MSDN备注:如果任何网络接口已标记且不是环回或隧道接口,则认为网络连接可用

在许多情况下,设备或计算机未连接到有用的网络,但仍被视为可用,GetIsNetworkAvailable将返回true。例如,如果运行应用程序的设备连接到需要代理的无线网络,但未设置代理,则GetIsNetworkAvailable将返回true。GetIsNetworkAvailable何时返回true的另一个示例是,应用程序是否在连接到集线器或路由器的计算机上运行,而集线器或路由器已失去上游连接

 if (NetworkInterface.GetIsNetworkAvailable() &&
     new Ping().Send(new IPAddress(new byte[] { 8, 8, 8, 8 }),2000).Status == IPStatus.Success)
 //is online
 else
 //is offline
在网络上Ping主机名 Ping和PingReply类允许应用程序通过从主机获取回复来确定远程计算机是否可以通过网络访问。这些类在System.Net.NetworkInformation命名空间中可用。以下示例显示如何ping主机

protected bool CheckConnectivity(string ipAddress)
{
    bool connectionExists = false;
    try
    {
        System.Net.NetworkInformation.Ping pingSender = new System.Net.NetworkInformation.Ping();
        System.Net.NetworkInformation.PingOptions options = new System.Net.NetworkInformation.PingOptions();
        options.DontFragment = true;
        if (!string.IsNullOrEmpty(ipAddress))
        {
            System.Net.NetworkInformation.PingReply reply = pingSender.Send(ipAddress);
            connectionExists = reply.Status == 
System.Net.NetworkInformation.IPStatus.Success ? true : false;
        }
    }
    catch (PingException ex)
    {
        Logger.LogException(ex.Message, ex);
    }
    return connectionExists;
}
根据MSDN的备注:应用程序使用Ping类检测远程计算机是否可访问。网络拓扑可以确定Ping是否可以成功联系rem 主持人。代理、网络地址转换NAT设备或防火墙的存在和配置可能会阻止Ping成功。成功的Ping表示只能在网络上访问远程主机;不能保证远程主机上存在更高级别的服务,如Web服务器

欢迎提出意见/建议。快乐编码

快速成功,但在没有连接时失败的速度非常慢。所以我想建立一个健壮的连接检查,它会更快地失败

据说Ping在所有环境中都不受支持,所以我从接受的答案开始,并添加了一个带有自定义超时的WebClient。你可以选择任何超时时间,但3秒对我来说在通过wifi连接时有效。我尝试添加一个快速迭代1秒,如果第一次失败,则添加一个慢速迭代3秒。但这毫无意义,因为两个迭代在未连接时总是失败,或者在连接时总是成功

我正在连接AWS,因为我想在连接测试通过后上载文件

public static class AwsHelpers
{
    public static bool GetCanConnectToAws()
    {
        try
        {
            using (var client = new WebClientWithShortTimeout())
            using (client.OpenRead("https://aws.amazon.com"))
                return true;
        }
        catch
        {
            return false;
        }
    }
}

public class WebClientWithShortTimeout: WebClient
{
    protected override WebRequest GetWebRequest(Uri uri)
    {
        var webRequest = base.GetWebRequest(uri);
        webRequest.Timeout = 5000;
        return webRequest;
    }
}
您可以使用NetworkInterface.GetIsNetworkAvailable方法,该方法指示是否有任何网络连接可用

public static bool Isconnected = false;

public static bool CheckForInternetConnection()
{
    try
    {
        Ping myPing = new Ping();
        String host = "google.com";
        byte[] buffer = new byte[32];
        int timeout = 1000;
        PingOptions pingOptions = new PingOptions();
        PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
        if (reply.Status == IPStatus.Success)
        {
            return true;
        }
        else if (reply.Status == IPStatus.TimedOut)
        {
            return Isconnected;
        }
        else
        {
            return false;
        }
    }
    catch (Exception)
    {
        return false;
    }
}

public static void CheckConnection()
{
    if (CheckForInternetConnection())
    {
        Isconnected = true;
    }
    else
    {
        Isconnected = false;
    }
}
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
    System.Windows.MessageBox.Show("This computer is connected to the internet");
}
else
{
    System.Windows.MessageBox.Show("This computer is not connected to the internet");
}
试试这个:

bool connection = NetworkInterface.GetIsNetworkAvailable();
if (connection == true)
 {
     MessageBox.Show("The system is online");
 }
 else {
     MessageBox.Show("The system is offline";
 }


如果用户有internet连接。如果用户可以连接到internet。为了发送电子邮件日志,只需发送电子邮件即可。如果用户未连接,您可能会收到某种异常,您可能无论如何都必须处理这些异常;你能说的就是他们过去是否有联系。假设您有一个方法:boolc=IsConnected;如果在调用IsConnected和DoSomething之间使用c{DoSomething;}-,则无线网络路由器可能已被拔出。IsConnected真的应该被称为WasRecentlyConnected。Windows NLM API应该是最好的。在不了解您的使用情况的情况下,您可能需要更加谨慎地关注防火墙不会阻止您对所关心的服务器的访问,而不是对互联网的访问。这可能比ping Google要好,因为我认为我们无法保证Google会继续响应ping。另一方面,我无法想象一个www.google.com不返回一些HTML的世界:@Daniel:一方面是真的,但另一方面,实际上下载该网站是有点开销的,无论是哪种方式,都没有理由收回4KB——只需使用client.OpenReadurl即可。如果它没有抛出异常,那么它就能够连接。这实际上效率不高。如果没有互联网,使用它可以让我的程序启动超过1分钟。可能是因为试图解析DNS。Pinging 8.8.8.8 google dns将其更改为3秒。@DanielVassallo我无法想象一个世界,例如,在中国,www.google.com不返回一些HTML……如果您的dns缓存中有google的IP,它将不会发送dns请求,因此,即使你没有连接,它也可能会返回真的。与问题的原始作者相比,使用此答案对更多人有益。请注意,许多学校和办公室都会阻止ping协议。傻,我知道。我找不到平班。你能帮帮我吗。我正在使用UWP,其他通过网络获取信息的方法都不正确!只要做到这一点,但要为所有的结果做好准备。考虑以下几点:如果网络在时间上落后,例如TracelGo、路由器ReStENOT OP,你需要做一些事情,但是我想这样做的原因是如果没有互联网连接,就避免默认的100秒超时。HTTP请求是在后台线程上完成的,因此UI线程不会被阻止,但我的应用程序无法退出,直到后台线程从HTTP请求返回并终止。如果我知道Internet连接已断开,我希望完全避免请求,而不是试图找到一些令人满意的中等超时值。我的观点是,我们无法解释远程服务何时可用/不可用。还有,那些不响应ping的站点呢?了解客户端无法访问您的特定web服务和客户端根本无法访问internet之间的区别当然很有用。我之所以关注这十年,是因为我希望一个本地应用在启动时,如果我的web服务关闭,与如果它无法访问网络,会有不同的行为;如果你不知道发生了什么事,你应该如何准备?+1你绝对无法可靠地检查是否有互联网连接。所有这一切都是在你点击谷歌时检查它是否启动。如果在你成功ping后的下一个瞬间,互联网就瘫痪了,那又怎样?在做之前检查是没有意义的。这与我回答的主要陈述有什么矛盾?使用google.com需要更多的时间,因为它需要解决。相反,直接使用IP进行ping将更快。ping到Google公共DNS

IP地址8.8.8.8或8.8.4.4对我来说很好。我想重申一点,小心——许多学校和办公室都会阻止ping协议。如果您将此方法用于客户将使用的应用程序,我建议您不要使用此方法检查Internet。您是否可以添加有关此方法速度的信息,以及此方法如何优于发布的其他解决方案。这将有助于您全面回答这个问题。此选项的问题是,即使网络未连接到internet,bb仍然是正确的。虽然这确实不能直接回答这个问题,我认为在尝试ping Google等之前,使用GetIsNetworkAvailable作为预检查仍然是有用的。此代码不会告诉您Internet连接是否可用。如果插入不带internet的网线,它将返回true.eeww。在.NET中使用COM地狱?@jgauffin你能解释一下为什么在.NET中应该避免使用COM吗?与我发现的其他解决方案相比,COM解决方案似乎工作得非常好。在测试期间,我发现当安装VMWare player时,InternetGetConnectedState返回true。必须在控制面板\Network and Internet\Network Connections VMNet1和VMNet8中禁用它。对我来说,最好的方法是,在这之后我仍然检查我的服务连接,然后启动例程。。。我只是想避免例外。这段代码只检查网络电缆是否插入。这段代码不可移植到Linux、MacOS。嗨@weapee,我告诉你你正在用.net core进行尝试,那么请记住这篇文章是在.net core时代之前的2014Great创意,但正如你所说的,可能并不完美。您还可以缓存发送/接收的字节,以便将来进行检查。但仍然不完美。此代码无效,请更正。它只检查网络电缆是否插入。根据MSDN:如果任何网络接口已标记且不是环回或隧道接口,则认为网络连接可用。除了检查ByTeSent和BytesReceived之外,您基本上只是复制了GetIsNetworkAvailable中已有的功能。@hackerman这是不明显的第一步。作为第二步,如果返回true,编码人员可以快速ping到他们自己的服务器。重要的是,这为有缺陷的windows api方法提供了一种替代方法。剩下的就是细节。伪造。如果没有网络接口,肯定没有互联网。用户界面可以立即更新,无需延迟,无需对其他主机进行进一步检查。请评论您的答案。只使用代码的答案是不允许的。这是非常不言自明的,为了维护而维护?这不是真的,我导入了Wininet.dll,插入了网络电缆,并在场景internet不可用时得到了正确的结果。好主意,但检查了网络可用性,not internet availability这个类还检查internet的可用性:问题是,我试过了,但只有在没有网络可用时才会触发它。从GetIsNetworkAvailability文档可以看出:如果任何网络接口被标记,并且不是环回或隧道接口,则认为网络连接可用。我不知道虚拟是否总是出现在界面的名称或描述中。这是标准吗?网络接口来自哪里?编辑:我发现它:System.Net.networkinformation对我来说总是返回true,即使我断开与Wifit的连接。这是一种有趣的方法,与其他答案完全不同+1.
bool connection = NetworkInterface.GetIsNetworkAvailable();
if (connection == true)
 {
     MessageBox.Show("The system is online");
 }
 else {
     MessageBox.Show("The system is offline";
 }