• 通过QT管理网络状态和网络连接


    QT主要通过以下四个类实现对网络状态和网络连接的管理,四个类分别是:

    QNetworkConfigurationManager
    QNetworkConfiguration
    QNetworkSession
    QNetworkInterface
    
    • 1
    • 2
    • 3
    • 4

    下面分别介绍一下四个类的职责和作用:
    QNetworkConfigurationManager 负责管理操作系统中的所有网络配置,通过它我们能获取操作系统中的网络配置信息,比如我们是否可以启停某个特定的网络连接。通过QNetworkConfigurationManager 获取的网络信息被存储在QNetworkConfiguration类中

    QNetworkConfiguration包含了一个网络访问入口的所有信息。这里要区分一下网络入口和网络连接,网络入口不等价于网络连接,一个网络连接能提供多个网络入口。QNetworkConfiguration是只读的,我们只能通过它来读取网络配置不能通过它来修改网络配置。通过它我们可以确定当前的网络类型是以太网、WLAN还是手机网络。

    通过QNetworkSession我们可以启停操作系统上的某个网络连接进而控制某个网络入口。通过它我们就可以控制某个应用的网络访问。

    QNetworkInterface提供了网络连接的一些基本信息,比如网卡的MAC地址网络连接的名称等等。

    下面介绍一下上面四个类的常见用法:

    QNetworkConfigurationManager

    1.获取特定状态的网络配置

    QNetworkConfigurationManager manager;
    //获取所有状态的网络配置
    QList<QNetworkConfiguration> cfg_list = manager.allConfigurations();
    //获取包含活跃会话的网络配置
    QList<QNetworkConfiguration> active_cfg_list = manager.allConfigurations(QNetworkConfiguration::Active);
    //获取发现的网络配置, 可以用来创建会话,但不能保证网络连接可用性
    QList<QNetworkConfiguration> discoverd_cfg_list = manager.allConfigurations(QNetworkConfiguration::Discovered);
    //获取系统记录的但不可用的网络连接配置,比如超出连接范围的wifi热点
    QList<QNetworkConfiguration> defined_cfg_list = manager.allConfigurations(QNetworkConfiguration::Defined);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    有时候扫描一些WLAN网络配置信息比较耗时,无法立即返回状态,我可以可以通过信号和槽的方式实现刷新成功之后获取配置状态。

    QNetworkConfigurationManager manager;
    QObject::connect(&manager,&QNetworkConfigurationManager::updateCompleted,this,[&](){
    	QList<QNetworkConfiguration> cfg_list = manager.allConfigurations();
    });
    //更新所有的网络配置信息
    manager.updateConfigurations();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.网络配置状态监测

    QNetworkConfigurationManager manager;
    //监测是否有新的配置出现
    //比如突然监测到某个wifi热点
    QObject::connect(&manager, &QNetworkConfigurationManager::configurationAdded,this,[&](const QNetworkConfiguration &config){
    	qDebug() << config.name();
    });
    //监测是否有配置消失
    //比如某个wifi热点突然监测不到了
    QObject::connect(&manager,&QNetworkConfigurationManager::configurationRemoved,this,[&](const QNetworkConfiguration &config){
    	qDebug() << config.name();
    });
    
    //监测是否有网络配置发生了变化
    QObject::connect(&manager,&QNetworkConfigurationManager::configurationChanged,this,[&](const QNetworkConfiguration &config){
    	qDebug() << config.name();
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    3.对网络连接状态进行监测

    QNetworkConfigurationManager manager;
    //判断是否在线
    manager.isOnline();
    //对网络在线状态进行监测
    QObject::connect(&manager,&QNetworkConfigurationManager::onlineStateChanged,this,[&](bool isonline){ });
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.获取网络配置的一些特性

    //获取当前平台支持的一些网络特性
    QNetworkConfigurationManager manager;
    QNetworkConfigurationManager::Capabilities capability_list = manager.capabilities();
    
    if(capability_list &QNetworkConfigurationManager::CanStartAndStopInterfaces)
    {
    	//可以对某个网络连接进行启停操作
    }
    if(capability_list &QNetworkConfigurationManager::ApplicationLevelRoaming)
    {
    	//当有更合适的网络入口出现的时候,系统会通知你
    	//可以动态的切换到更加合适的网络连接上
    }
    if(capability_list &QNetworkConfigurationManager::DataStatistics)
    {
    	//QNetworkSession包含接收和发送的数据信息
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    QNetworkConfiguration

    1.获取网络访问配置的信息

    QNetworkConfigurationManager manager;
    QNetworkConfiguration cfg = manager.defaultConfiguration();
    //获取网络配置的名称
    cfg.name();
    //获取网络配置的标识符, 全局唯一
    cfg.identifier();
    //网络类型WLAN/2G/CDMA2000/WCDMA/HSPA/Bluetooth
    cfg.bearerType();
    //配置的目标:PrivatePurpose(访问私有网络)
    //PublicPurpose(访问公有网络)
    cfg.purpose();
    //配置的状态(defined/discovered/active)
    cfg.state();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    QNetworkSession

    1.启动或保持一个网络接口

    QNetworkConfigurationManager manager;
    QNetworkConfiguration cfg = manager.defaultConfiguration();
    QNetworkSession* session = new QNetworkSession(cfg,this);
    //会话打开时的处理逻辑
    QObject::connect(session,&QNetworkSession::opened,this,[&](){ /*do someting*/});
    //会话关闭时的处理逻辑
    QObject::connect(session,&QNetworkSession::closed,this,[&](){ /*do someting*/});
    //操作过程中的错误信号的处理逻辑
    QObject::connect(session,&QNetworkSession::error,this,[&](QNetworkSession::SessionError error){/*do someting*/});
    //会话状态变化的时候处理逻辑
    QObject::connect(session,&QNetworkSession::stateChanged,this,[&](QNetworkSession::State state){/*do someting*/});
    //有更好的网络配置出现时的处理逻辑
    //比如在使用2G网络的时候出现了可以连接的wifi
    QObject::connect(session,&QNetworkSession::preferredConfigurationChanged,[&](const QNetworkConfiguration &config, bool isSeamless){/*do someting*/});
    //默认是异步的
    session->open();
    //可以通过Wait操作实现等待
    session->waitForOpened();
    //关闭操作
    session->stop();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2.网络漫游管理

    QNetworkConfigurationManager manager;
    QNetworkConfiguration cfg = manager.defaultConfiguration();
    QNetworkSession* session = new QNetworkSession(cfg,this);
    //支持漫游的话
    if(cfg.isRoamingAvailable())
    {
    	//拒绝漫游
    	session->ignore();
    	//接受漫游
    	//每次切换网络配置的时候会发送
    	//newConfigurationActivated信号
    	session->migrate();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    QNetworkInterface

    1.获取网络连接的状态信息

    // 获取所有网络接口列表
    QList<QNetworkInterface> nets = QNetworkInterface::allInterfaces();
    for(QNetworkInterface index : nets)
    {
    	//获取对应网络连接的Mac地址
    	qDebug() << index.hardwareAddress();
    	//获取网络连接的名称
    	qDebug() << index.name();
    	//获取IP地址、子网掩码、广播地址的列表
    	QList<QNetworkAddressEntry> address_list = index.addressEntries();
    	//获得连接的状态值
    	QNetworkInterface::InterfaceFlags  flags = index.flags();
    	//状态值列表:
    	//IsUp:该网络连接被启动
    	//IsRunning:该网络连接被分配了资源
    	//CanBroadcast:该网络连接处于广播模式
    	//IsLoopBack:网络接口是一个环回接口。也就是说,它是一个虚拟接口,其目的地是主机本身
    	//IsPointToPoint:网络接口是一个点对点接口.也就是说,它可以直接访问一个单独的其他地址
    	//CanMulticast:该网络接口支持多广播
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    Kafka使用教程和案例详解
    DyGRAIN: An Incremental Learning Framework for Dynamic Graphs
    短视频矩阵系统源码开发
    [附源码]计算机毕业设计springboot基于Vuejs的中国名茶销售平台
    std::packaged_task 源码分析
    分布式锁全家桶
    项目运行状况不断,怎么办?看看企业级监控项目Skywalking吧
    时序数据库 | InfluxDB - 行协议
    怎样录屏没有外界杂音?3个十分好用的方法,码住收藏!
    flask 添加用户认证API , 客户端用户认证
  • 原文地址:https://blog.csdn.net/yang1fei2/article/details/126310819