当前位置:C++技术网 > 精选软件 > C++实现判断网络连接情况以及连接的方式

C++实现判断网络连接情况以及连接的方式

更新时间:2015-08-15 22:08:53浏览次数:1+次

    使用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这个状态已无效了,所以这里永远也不会进去。