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

时间:2008-10-11 22:23:32

标签: c# .net winforms

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

8 个答案:

答案 0 :(得分:15)

以下将确定您是否已连接到网络,但这并不一定意味着您已连接到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); 

答案 1 :(得分:10)

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

正确翻译如下。


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

答案 2 :(得分:9)

我不是c#开发人员,但在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#

答案 3 :(得分:2)

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

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事件监视连接是否丢失的想法。我的应用程序供没有经验的用户使用,在笔记本电脑上,互联网连接不稳定(通常在澳大利亚内陆地区)。

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

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

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