检查C#是否可以使用Internet连接

时间:2009-07-05 23:19:30

标签: c# windows-7

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

编辑: 正如建议我尝试使用以下方法,但它总是返回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();
}
}

其他信息(如果有帮助):我通过共享的无线网络访问互联网。

9 个答案:

答案 0 :(得分:21)

Here是您可以调用的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 ) ;
    }
}

答案 1 :(得分: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。如果地址不匹配,则假定互联网连接无法正常运行。

答案 2 :(得分:7)

您可以在.NET 2.0 +

中使用此功能检查网络连接
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();

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

答案 3 :(得分:7)

这是我到目前为止找到的最佳解决方案:

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
}

答案 4 :(得分:6)

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

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

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

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

如果您可以更具体地了解为什么要检查它,将更容易提供满足您要求的答案......

答案 5 :(得分:4)

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

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

你应该将它包装在Try .... Catch中,以捕获无法建立连接时引发的异常。

答案 6 :(得分:2)

Network Awareness in Windows XP

Network Awareness in Windows Vista and Windows 7

当然,这并不能保证您计划访问的网站不会受到合作防火墙规则the API just checking if a pre-defined web site is reachable的阻止。

答案 7 :(得分:0)

还有其他一些选择。

InfoPath库公开了"IsDestinationReachable"方法,该方法是同名Win API方法的包装器。 (看起来Vista不支持它)

但是,我相信Docs认为它取决于像PING这样的东西,所以不一定是一个好的测试。

Vista +说使用"Network List Manager"

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

答案 8 :(得分:0)

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

public static bool DnsTest()
    {
        try
        {
            System.Net.IPHostEntry ipHe =
                System.Net.Dns.GetHostByName("www.google.com");
            return true;
        }
        catch
        {
            return false;
        }
    }
相关问题