簡體   English   中英

檢查C#是否可以使用Internet連接

[英]check whether Internet connection is available with C#

以編程方式檢查互聯網連接是否可用的最簡單方法是什么?

編輯:建議我嘗試使用以下方法,但它總是返回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();
}
}

附加信息(如果有幫助):我通過共享的無線網絡訪問互聯網。

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

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。 如果地址不匹配,則假定互聯網連接無法正常運行。

您可以在.NET 2.0+中使用它來檢查網絡連接

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

對於本地網絡,這可能只會返回true ,因此它可能對您不起作用。

這是我到目前為止找到的最佳解決方案:

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
}

這是一個問題,答案真的是“它取決於”。 因為這取決於您要檢查的原因以及連接的類型? 您希望能夠通過http訪問某些網站/服務嗎? 發送smtp郵件? dns查找?

使用先前答案的組合可能是要走的路 - 首先使用來自colithium的答案的wininet api來檢查是否有任何類型的連接可用。

如果是,請嘗試幾個dns查找(請參閱System.Net.Dns),查找您感興趣的資源或一些流行的大型網站(google,altavista,compuserve等等)。

接下來,您可以嘗試ping(請參閱Roger Willcocks的回答)和/或建立到相同站點的套接字連接。 請注意,ping失敗只是意味着防火牆規則不允許您ping。

如果您可以更具體地了解為什么要檢查它,將更容易提供滿足您要求的答案...

最簡單的方法是檢查他們是否可以從您知道可用的網頁下載文件。 使用以下代碼下載谷歌的主頁。

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

您應該將它包裝在Try .... Catch中以捕獲無法建立連接時引發的異常。

Windows XP中的網絡意識

Windows Vista和Windows 7中的網絡感知

當然,這並不能保證您計划訪問的網站不會被協作防火牆規則阻止, API只會檢查是否可以訪問預定義的網站

還有一些其他選擇。

InfoPath庫公開了“IsDestinationReachable”方法,該方法是同名Win API方法的包裝器。 (看起來Vista不支持它)

但是,我相信Docs認為它取決於像PING這樣的東西,所以不一定是一個好的測試。

Vista +說使用“網絡列表管理器”

@colithium Google可能沒有關閉,但如果DNS lokup間隔超過超時,事情也會失敗。 在新西蘭的家里並不罕見,首先嘗試失敗,第二次成功,因為數據在第二次請求完成時已經傳回ISP DNS或路由器緩存。

或者,您可以使用DNS查找來檢查互聯網連接。 此方法比Ping方法快。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM