使用InternetGetConnectedState检查互联网连接是否始终为true

本文关键字:true 是否 连接 InternetGetConnectedState 检查 互联网 使用 | 更新日期: 2023-09-27 17:50:39

我需要检查我的Compact Framework应用程序是否有互联网连接。

所以环顾四周,我发现了InternetGetConnectedState方法,但在我的情况下,每次我检查我是否有互联网连接,它返回true,即使我离线。

代码如下:

[DllImport("wininet.dll", CharSet = CharSet.Auto)]
private extern static bool InternetGetConnectedState(ref InternetConnectionState_e lpdwFlags, int dwReserved);
[Flags]enum InternetConnectionState_e : int
{
    INTERNET_CONNECTION_MODEM = 0x01,
    INTERNET_CONNECTION_LAN = 0x02,
    INTERNET_CONNECTION_PROXY = 0x04,
    INTERNET_RAS_INSTALLED = 0x10,
    INTERNET_CONNECTION_OFFLINE = 0x20,
    INTERNET_CONNECTION_CONFIGURED = 0x40
}
public Form1()
{
    InitializeComponent();
    verify();
}
private void verify()
{
    // In function for checking internet
    InternetConnectionState_e flags = 0;
    bool isConnected = InternetGetConnectedState(ref flags, 0);
    textBox1.Text = "Con: " + isConnected.ToString();
    textBox1.Text += "'r'nDescr: " + flags.ToString();
}
private void button1_Click(object sender, EventArgs e)
{
    verify();
}
private void button2_Click(object sender, EventArgs e)
{
    this.Close();
}

我做错了什么?

使用InternetGetConnectedState检查互联网连接是否始终为true

看起来你的p/Invoke internetgetconnectedstate签名可能有点不对劲。

复制上面的链接,签名似乎寻找int作为第一个参数:

[DllImport("wininet.dll", SetLastError=true)]
extern static bool InternetGetConnectedState( out int lpdwFlags Description, int dwReserved );
[Flags]
enum ConnectionStates
{
    Modem = 0x1,
    LAN = 0x2,
    Proxy = 0x4,
    RasInstalled = 0x10,
    Offline = 0x20,
    Configured = 0x40,
}

示例代码的用法看起来很简单:

using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication2
{
  internal class Program
  {
   [DllImport("wininet.dll", SetLastError = true)]
   private static extern bool InternetGetConnectedState(out int lpdwFlags, int dwReserved);
   private static void Main(string[] args)
   {
    int flags;
    bool isConnected = InternetGetConnectedState(out flags, 0);
    Console.WriteLine(string.Format("Is connected :{0} Flags:{1}", isConnected, flags));
   }
  }
}

你得到了什么错误?您总是可以将InternetGetConnectedState方法封装在try...catch块中:

   private static void Main(string[] args)
   {
    int flags;
    bool isConnected = false;
    try
    {
      isConnected = InternetGetConnectedState(out flags, 0);
    } catch (Exception err)
    {
      Console.WriteLine(err.Message);
    }
    Console.WriteLine(string.Format("Is connected :{0} Flags:{1}", isConnected, flags));
   }
  }

希望对你有帮助。

UPDATE基于您的flags = 18结果:

flags被定义为int,所以18是十进制表示。

在二进制中,这将是0001 0010,它将映射到LAN (0x2) | RasInstalled (0x10)

所以,我猜你是通过局域网连接的,但它不能保证局域网有互联网接入。为了测试这一点,你需要尝试浏览到一个已知的好网站。

RAS我不确定。远程访问服务?

请记住:充电器中的设备也可以注册为Connected