[英]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中以捕獲無法建立連接時引發的異常。
還有一些其他選擇。
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.