在WinForms应用程序中判断网络连接状态,可以通过以下两种方式实现:使用系统级API或通过网络请求测试。
### 一、使用系统级API(推荐)
Windows提供了`InternetGetConnectedState`函数,可快速判断设备是否联网,包括网络连接类型(如Wi-Fi、调制解调器)和是否通过代理。
#### 1.1 C#实现示例
```csharp
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public partial class MainForm : Form
{
[DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetGetConnectedState(ref int dwFlags, int dwReserved);
private const int INTERNET_CONNECTION_MODEM = 1;
private const int INTERNET_CONNECTION_LAN = 2;
private void btnCheckConnection_Click(object sender, EventArgs e)
{
int flags = 0;
if (!InternetGetConnectedState(ref flags, 0))
{
MessageBox.Show("未连网!");
}
else if ((flags & INTERNET_CONNECTION_MODEM) != 0)
{
MessageBox.Show("通过调制解调器连接");
}
else if ((flags & INTERNET_CONNECTION_LAN) != 0)
{
MessageBox.Show("通过局域网连接");
}
else
{
MessageBox.Show("未检测到网络连接");
}
}
}
```
#### 1.2 功能说明
- **连接类型判断** :通过`dwFlags`参数判断是通过网卡(`INTERNET_CONNECTION_MODEM`)还是局域网(`INTERNET_CONNECTION_LAN`)连接。
- **代理检测** :该函数可检测是否通过代理服务器上网。
### 二、通过网络请求测试(补充)
若需进一步确认网络可用性(如能否访问特定服务器),可通过`System.Net.Sockets`命名空间中的`TcpClient`进行简单测试。
#### 2.1 C#实现示例
```csharp
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;
public partial class NetworkTestForm : Form
{
private void btnPingTest_Click(object sender, EventArgs e)
{
string host = "www.baidu.com";
try
{
using (TcpClient client = new TcpClient(host, 80))
{
NetworkStream stream = client.GetStream();
byte[] buffer = Encoding.ASCII.GetBytes("GET / HTTP/1.1\r\nHost: " + host + "\r\n\r\n");
stream.Write(buffer, 0, buffer.Length);
string response = Encoding.ASCII.GetString(stream.Read());
MessageBox.Show("可访问:" + response);
}
}
catch (Exception ex)
{
MessageBox.Show($"无法访问:{ex.Message}");
}
}
}
```
#### 2.2 功能说明
- **可达性测试** :尝试连接百度服务器的80端口,判断是否可访问外部网络。
- **异常处理** :捕获连接异常(如DNS失败、端口被阻)并提示用户。
### 三、注意事项
**局域网检测限制** :`InternetGetConnectedState`可能返回`true`但在局域网内无法访问互联网,需结合其他方法(如尝试外部域名)综合判断。
**虚拟网络适配器** :部分情况下需排除虚拟网卡,可通过`ManagementObjectSearcher`筛选`Virtual=False`的网卡。
**性能优化** :频繁进行网络请求可能影响性能,建议合理设置检测间隔(如每秒一次)。
通过以上方法,可灵活判断网络连接状态及可用性,满足不同场景需求。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。