QT主要通过以下四个类实现对网络状态和网络连接的管理,四个类分别是:
QNetworkConfigurationManager
QNetworkConfiguration
QNetworkSession
QNetworkInterface
下面分别介绍一下四个类的职责和作用:
QNetworkConfigurationManager 负责管理操作系统中的所有网络配置,通过它我们能获取操作系统中的网络配置信息,比如我们是否可以启停某个特定的网络连接。通过QNetworkConfigurationManager 获取的网络信息被存储在QNetworkConfiguration类中
QNetworkConfiguration包含了一个网络访问入口的所有信息。这里要区分一下网络入口和网络连接,网络入口不等价于网络连接,一个网络连接能提供多个网络入口。QNetworkConfiguration是只读的,我们只能通过它来读取网络配置不能通过它来修改网络配置。通过它我们可以确定当前的网络类型是以太网、WLAN还是手机网络。
通过QNetworkSession我们可以启停操作系统上的某个网络连接进而控制某个网络入口。通过它我们就可以控制某个应用的网络访问。
QNetworkInterface提供了网络连接的一些基本信息,比如网卡的MAC地址网络连接的名称等等。
下面介绍一下上面四个类的常见用法:
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);
有时候扫描一些WLAN网络配置信息比较耗时,无法立即返回状态,我可以可以通过信号和槽的方式实现刷新成功之后获取配置状态。
QNetworkConfigurationManager manager;
QObject::connect(&manager,&QNetworkConfigurationManager::updateCompleted,this,[&](){
QList<QNetworkConfiguration> cfg_list = manager.allConfigurations();
});
//更新所有的网络配置信息
manager.updateConfigurations();
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();
});
3.对网络连接状态进行监测
QNetworkConfigurationManager manager;
//判断是否在线
manager.isOnline();
//对网络在线状态进行监测
QObject::connect(&manager,&QNetworkConfigurationManager::onlineStateChanged,this,[&](bool isonline){ });
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.获取网络访问配置的信息
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.启动或保持一个网络接口
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();
2.网络漫游管理
QNetworkConfigurationManager manager;
QNetworkConfiguration cfg = manager.defaultConfiguration();
QNetworkSession* session = new QNetworkSession(cfg,this);
//支持漫游的话
if(cfg.isRoamingAvailable())
{
//拒绝漫游
session->ignore();
//接受漫游
//每次切换网络配置的时候会发送
//newConfigurationActivated信号
session->migrate();
}
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:该网络接口支持多广播
}