以编程方式检查互联网连接是否可用的最简单方法是什么?
编辑: 正如建议我尝试使用以下方法,但它总是返回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();
}
}
其他信息(如果有帮助):我通过共享的无线网络访问互联网。
答案 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;
}
}