繁体   English   中英

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

[英]How do you determine if an Internet connection is available for your WinForms App?

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

以下内容将确定您是否已连接到网络,但这并不一定意味着您已连接到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#开发人员,但在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事件来监视连接是否丢失的想法。 我的应用程序供互联网连接不稳定(通常在澳大利亚内陆地区)的笔记本电脑上没有经验的用户使用。

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

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

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

Ping google.com(或知名主机列表),或尝试实际执行您的应用程序需要Internet连接的功能之一(从结构上讲)。 在任何操作系统上,没有办法真正确定Internet连接是否正常工作而不实际尝试进行通信,这与操作系统对构成“可用”的观点相反。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM