C# 使用InternetGetConnectedState检查internet连接始终为true
我需要检查我的Compact Framework应用程序是否具有internet连接 因此,环顾四周,我找到了C# 使用InternetGetConnectedState检查internet连接始终为true,c#,compact-framework,C#,Compact Framework,我需要检查我的Compact Framework应用程序是否具有internet连接 因此,环顾四周,我找到了InternetGetConnectedState方法,但在我的例子中,每次检查是否有internet连接时,它都会返回true,即使在我脱机时也是如此 代码如下: [DllImport("wininet.dll", CharSet = CharSet.Auto)] private extern static bool InternetGetConnectedState(ref Inte
InternetGetConnectedState
方法,但在我的例子中,每次检查是否有internet连接时,它都会返回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();
}
我做错了什么?看起来你的签名可能有点不对劲
从上面的链接复制时,签名似乎在寻找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));
}
}
希望有帮助
根据您的标志=18
结果更新:
flags
定义为int
,因此18是十进制表示
在二进制中,这将是0001 0010
,它将映射到LAN(0x2)| RasInstalled(0x10)
所以,我猜你是通过局域网连接的,但这并不保证局域网可以访问互联网。要测试这一点,您需要尝试浏览到一个已知的好站点
RAS我不确定
请记住:安装在充电器中的设备也可能注册为已连接。当您说您处于“脱机”状态时,您的本地系统是否明确处于脱机状态?这就是这个电话的离线含义。据我所知,检测你是否可以访问互联网的唯一可靠方法是尝试一下,看看是否失败。是的。你想连接到什么?你能连接到它吗?如果没有,那么假设你没有连接。好的,我希望找到一种方法知道我的手机是否连接到互联网。感谢您的评论我尝试了一下,当我在线和离线时都会得到相同的结果:isConnected=true和Flags=18
Flags=18
看起来您已经连接了。看到我更新的答案。好的,但在我的情况下,它总是给我18作为结果。我每次都会浏览谷歌,当我连接时,当我不连接时,它会给出相同的结果(总是在停靠之外)。我们这里所有的工作设备都可以连接到我们的局域网,但它们没有连接到互联网。不确定,但我认为这是由我们的网络管理员通过组策略设置完成的。