26

以编程方式检查互联网连接是否可用的最简单方法是什么?

编辑:正如我所建议的,我尝试使用以下方法,但它总是返回 true。

[Flags]
enum InternetConnectionState : int
{
    INTERNET_CONNECTION_MODEM = 0x1,
    INTERNET_CONNECTION_LAN = 0x2,
    INTERNET_CONNECTION_PROXY = 0x4,
    INTERNET_RAS_INSTALLED = 0x10,
    INTERNET_CONNECTION_OFFLINE = 0x20,
    INTERNET_CONNECTION_CONFIGURED = 0x40
}

class Program
{
    [DllImport("WININET", CharSet = CharSet.Auto)]
    static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved);

static void Main(string[] args)
{
    InternetConnectionState flags = 0;
    bool isConnected = InternetGetConnectedState(ref flags, 0);
    Console.WriteLine(isConnected);
    //Console.WriteLine(flags);
    Console.ReadKey();
}
}

附加信息(如果有帮助):我通过共享的 wifi 网络访问互联网。

4

9 回答 9

21

是您可以调用的 Windows API。它在 wininet.dll 中并称为InternetGetConnectedState

using System;
using System.Runtime;
using System.Runtime.InteropServices;

public class InternetCS
{
    //Creating the extern function...
    [DllImport("wininet.dll")]
    private extern static bool InternetGetConnectedState( out int Description, int ReservedValue );

    //Creating a function that uses the API function...
    public static bool IsConnectedToInternet( )
    {
        int Desc ;
        return InternetGetConnectedState( out Desc, 0 ) ;
    }
}
于 2009-07-05T23:24:48.090 回答
10

Microsoft windows vista 和 7 使用 NCSI(网络连接状态指示器)技术:

NCSI 在 www.msftncsi.com 上执行 DNS 查找,然后请求http://www.msftncsi.com/ncsi.txt。此文件是纯文本文件,仅包含文本“Microsoft NCSI”。NCSI 为 dns.msftncsi.com 发送 DNS 查找请求。此 DNS 地址应解析为 131.107.255.255。如果地址不匹配,则假定 Internet 连接无法正常运行。

于 2012-01-09T15:07:48.063 回答
8

这是迄今为止我找到的最佳解决方案:

public static bool isConnected()
    {
        try
        {
            string myAddress = "www.google.com";
            IPAddress[] addresslist = Dns.GetHostAddresses(myAddress);

            if (addresslist[0].ToString().Length > 6)
            {
                return true;
            }
            else
                return false;

        }
        catch
        {
            return false;
        }

    }

用法:

if(isConnected())
{
    //im connected to the internet
}
else
{
    //not connected
}
于 2011-09-23T06:24:35.177 回答
7

您可以在 .NET 2.0+ 中使用它来检查网络连接

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();

这可能只会返回true本地网络,因此它可能不适合您。

于 2009-07-05T23:29:56.443 回答
6

这是一个答案真的是“取决于”的问题。因为这取决于您为什么要检查以及什么样的连接?您希望能够通过 http 访问某些网站/服务吗?发送 smtp 邮件?做dns查找吗?

使用先前答案的组合可能是要走的路 - 首先使用来自 colithium 答案的 wininet api 检查是否有任何类型的连接可用。

如果是,请尝试对您感兴趣的资源或一些流行的大型网站(google、altavista、compuserve 等)进行几次 dns 查找(请参阅 System.Net.Dns)。

接下来,您可以尝试 ping(参见 Roger Willcocks 的回答)和/或建立到相同站点的套接字连接。请注意,ping 失败可能只是意味着防火墙规则不允许您 ping。

如果您可以更具体地说明要检查的原因,那么提供满足您要求的答案会更容易......

于 2009-07-06T03:35:50.350 回答
4

最简单的方法可能是检查他们是否可以从您知道可用的网络上下载文件。使用以下代码下载google的主页。

WebClient Client = new WebClient ();
String Response;
Response = Client.DownloadString("http://www.google.com");

您可能应该将其包装在 Try .... Catch 以捕获无法建立连接时引发的异常。

于 2009-07-05T23:25:17.013 回答
2

Windows XP 中的网络感知

Windows Vista 和 Windows 7 中的网络感知

当然,这并不能保证您计划访问的网站不会被合作防火墙规则阻止,API 只是检查预定义的网站是否可访问

于 2011-09-24T00:54:39.543 回答
0

还有一些其他的选择。

InfoPath 库公开了“IsDestinationReachable”方法,它是同名 Win API 方法的包装。(貌似Vista不支持)

但是,我从文档中相信它取决于 PING 之类的东西,所以不一定是一个好的测试。

Vista + 说使用“网络列表管理器”

@colithium Google 可能不会关闭,但如果 DNS 查找间隔超过超时,事情也可能会失败。在新西兰的家中并不少见,第一次尝试失败,第二次成功,因为在第二次请求完成时数据已经传播回 ISP DNS 或您的路由器缓存。

于 2009-07-06T02:50:35.190 回答
0

或者,您可以使用 DNS 查找来检查 Internet 连接。这种方法比 Ping 方法快。

public static bool DnsTest()
    {
        try
        {
            System.Net.IPHostEntry ipHe =
                System.Net.Dns.GetHostByName("www.google.com");
            return true;
        }
        catch
        {
            return false;
        }
    }
于 2017-01-31T09:55:20.177 回答