使用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();
}
我做错了什么?
看起来你的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
。