使用C++实现的判断电脑网络是否连接,以及通过什么方式连接的代码实现。代码中有比较清楚的注释,后面再简单解释一下代码,很简单。
先看看效果图:
下面来看看代码实现,可以直接复制,CTRL+C复制,放在项目中就可以了。
#include <Windows.h>// Windows定义的类型DWORD等
#include <Wininet.h>// InternetGetConnectedState声明
#include <Sensapi.h>// IsNetworkAlive声明
#include <iostream> // C++输入输出头文件,C++技术网提供代码
using namespace std;
// 导入lib文件的预编译指令,不必在项目属性中添加了
#pragma comment(lib,"Wininet.lib")
#pragma comment(lib,"Sensapi.lib")
void ShowInternetConnectedState()
{
DWORD flags;//上网方式
BOOL m_bOnline = TRUE;//是否在线
m_bOnline = InternetGetConnectedState(&flags, 0);
if (m_bOnline)//网络已连接
{
// - 通过返回的标志来与预定义好的标志对比判断
if ((flags & INTERNET_CONNECTION_MODEM) == INTERNET_CONNECTION_MODEM)
{
cout << "网络已连接:拨号上网\n";
}
if ((flags & INTERNET_CONNECTION_LAN) == INTERNET_CONNECTION_LAN)
{
cout << "网络已连接:通过局域网连接\n";
}
if ((flags & INTERNET_CONNECTION_PROXY) == INTERNET_CONNECTION_PROXY)
{
cout << "网络已连接:通过代理连接\n";
}
if ((flags & INTERNET_CONNECTION_MODEM_BUSY) == INTERNET_CONNECTION_MODEM_BUSY)
{
cout << "MODEM被其他非INTERNET连接占用\n";
}
}
else
cout << "网络未连接\n";
}
void ShowIsNetworkAlive()
{
DWORD flags;//上网方式
BOOL m_bOnline = TRUE;//是否在线
m_bOnline = IsNetworkAlive(&flags);
if (m_bOnline)//网络已连接
{
if ((flags & NETWORK_ALIVE_LAN) == NETWORK_ALIVE_LAN)
{
cout << "网络已连接:通过局域网连接\n";
}
if ((flags & NETWORK_ALIVE_WAN) == NETWORK_ALIVE_WAN)
{
cout << "网络已连接:通过广域网连接\n";
}
if ((flags & NETWORK_ALIVE_AOL) == NETWORK_ALIVE_AOL)
{
cout << "网络已连接:已连接至美国网络(此状态已不可用)\n";
}
}
else
cout << "网络未连接\n";
}
void main()
{
int i = 0;
while (TRUE)
{
cout << "请选择测试的方式:1 或者 2\n"
<< "1. 获取网络状态\n"
<< "2. 检查网络是否活动\n"
<< endl;
cin >> i;
switch (i)
{
case 1:
ShowInternetConnectedState();
break;
case 2:
ShowIsNetworkAlive();
break;
default:
cout << "错误!\n";
}
cout << endl;
}
}
代码说明:
1.核心的就是两个函数,这两个函数都可以检测。区别在于响应是否及时。这两个函数都需要包含一个对应的头文件以及导入lib库,代码中说明了。
2.IsNetworkAlive()可以及时反应网络连通情况,但是需要服务System Event Notification支持(系统默认自动启动该服务)。使用该函数,需要安装最新的SDK(如.net的)。
3.InternetGetConnectedState():对网络状况不能及时反应。
4.两个函数都会取回一个网络连接状态的标志flag,标志flag存储了当前网络连接方式的状态值,然会分别与其中一种状态位于,取出这个flag中的这个状态位,再与这个状态位位与。如果位与为1,那么这个就是这状态,如果为0,则不是这个状态。
5.返回值直接可以判断是否联网,而第4个做的事情就是来细分网络连接方式的。
6.NETWORK_ALIVE_AOL这个状态已无效了,所以这里永远也不会进去。