如何确定您的WinForms应用程序是否可以使用Internet连接?

确定WinForms应用程序是否有可用的Internet连接的最佳方法是什么。 (当然是以编程方式)如果用户未连接到Internet,我想禁用/隐藏某些function。

以下将确定您是否连接到网络,但这并不一定意味着您已连接到Internet:

NetworkInterface.GetIsNetworkAvailable() 

这是史蒂夫的代码的C#翻译似乎相当不错:

 private static int ERROR_SUCCESS = 0; public static bool IsInternetConnected() { long dwConnectionFlags = 0; if (!InternetGetConnectedState(dwConnectionFlags, 0)) return false; if(InternetAttemptConnect(0) != ERROR_SUCCESS) return false; return true; } [DllImport("wininet.dll", SetLastError=true)] public static extern int InternetAttemptConnect(uint res); [DllImport("wininet.dll", SetLastError=true)] public static extern bool InternetGetConnectedState(out int flags,int reserved); 

sbeskur的回复在InternetGetConnectedState的翻译中有一个错误。 参数都是DWORD(第一个是LPDWORD)。 这两个都转换为C#中的int(技术上,uint但int适用于大多数场景)。

正确翻译如下。

 [DllImport("wininet.dll", SetLastError=true)] public static extern bool InternetGetConnectedState(out int flags,int reserved); 

我不是ac#developer,但在C ++中你可以使用Win32 API(特别是来自Wininet.dll),如下所示:

 bool IsInternetConnected( void ) { DWORD dwConnectionFlags = 0; if( !InternetGetConnectedState( &dwConnectionFlags, 0 ) ) return false; if( InternetAttemptConnect( 0 ) != ERROR_SUCCESS ) return false; return true; } 

我认为这很简单地变成了c#

我在其他地方找到了这个代码,但我真的想知道是否有更好的方法。

 HttpWebRequest req; HttpWebResponse resp; try { req = (HttpWebRequest)WebRequest.Create("http://www.google.com"); resp = (HttpWebResponse)req.GetResponse(); if(resp.StatusCode.ToString().Equals("OK")) { Console.WriteLine("its connected."); } else { Console.WriteLine("its not connected."); } } catch(Exception exc) { Console.WriteLine("its not connected."); } 

我喜欢通过NetworkInterface抛出的NetworkChange事件监视连接是否丢失的想法。 我的应用程序供没有经验的用户使用,在笔记本电脑上,互联网连接不稳定(通常在澳大利亚内陆地区)。

InternetGetConnected状态是确定您已连接到网络的第一步。 为了确定您是否有互联网连接,一种技术是使用IPHelper api为互联网上的某些服务器发送ARP (地址解析协议)请求。

Ping google.com(或众所周知的主机列表)或尝试实际执行应用程序需要Internet连接的function之一(在结构意义上)。 在任何操作系统上,没有办法真正确定互联网连接是否在没有实际尝试通信的情况下正常运行,而不是操作系统对什么构成“可用”的看法。

NetworkInterface.GetIsNetworkAvailable() ,对互联网连接的猜测将是网络可用性。 NetworkChange上的事件可以告诉您何时更改。 这两个类都在System.Net.NetworkInformation命名空间中。

当然,在尝试连接某些内容之前,您不会知道Internet是否真的可用。

http://www.csharphelp.com/archives3/archive499.html

此外,滚动浏览专家交流链接: http : //www.csharpfriends.com/Forums/ShowPost.aspx?PostID = 13045 ,您会看到一些建议。

此外,如果你是VB.Net(可以链接到btw)的My命名空间的游戏,My.Computer.Network.IsAvailable是最简单的解决方案。