编程语言
首页 > 编程语言> > Qt网络编程:QNetworkSession

Qt网络编程:QNetworkSession

作者:互联网

一、描述

QNetworkSession 封装网络会话。会话的配置参数是通过它所绑定的 QNetworkConfiguration 对象确定的。 根据会话的类型(单个接入点或服务网络),会话可能会链接到一个或多个网络接口。 通过打开和关闭网络会话,开发人员可以启动和停止系统网络接口。

如果配置代表多个接入点(QNetworkConfiguration::ServiceNetwork),则可能支持更高级的功能,例如漫游。

QNetworkSession 支持同一进程内的会话管理,并且根据平台的功能可能支持进程外会话。 如果多个打开的会话使用相同的网络配置,则仅在最后一个会话关闭后才终止底层网络接口。

1.1、漫游

应用程序可以连接到 preferredConfigurationChanged() 信号,以便在更合适的接入点可用时接收通知。 响应此信号,应用程序必须通过 migrate() 或 ignore() 新接入点启动漫游。一旦会话漫游,就会发出 newConfigurationActivated() 信号。应用程序现在可以测试载体并且必须 accept() 或reject() 它。 如果漫游被拒绝,会话将返回到之前的接入点。

某些平台可能会区分强制漫游和应用程序级漫游 (ALR)。 ALR 意味着应用程序控制(通过 migrate()、ignore()、accept() 和 reject())网络会话是否可以从一个接入点漫游到下一个接入点。强制漫游意味着系统自动漫游到下一个网络而无需咨询应用程序。这样做的优点是应用程序可以使用漫游功能而实际上并不知道它。预计应用程序检测到底层socket已损坏并通过新的网络链接自动重新连接。


二、类型成员

1、enum QNetworkSession::SessionError:此枚举描述了可能发生的会话错误。

2、enum QNetworkSession::State:此枚举描述会话的连接状态。

3、enum QNetworkSession::UsagePolicy:此枚举允许系统通知应用程序可能存在的网络使用限制。


三、成员函数

1、void accept()

会话永久接受新的接入点。如果没有其他网络会话,旧接入点可能会在此过程中关闭。

2、void close()

减少相关网络配置上的会话计数器。如果会话计数器达到零,则活动网络接口将关闭。 这意味着如果当前会话是最后一个打开的会话,state() 会从 Connected 更改为 Disconnected 。

如果平台不支持进程外会话,调用此函数不会停止接口。在这种情况下,必须使用 stop() 强制关闭。 可以通过 QNetworkConfigurationManager::capabilities() 检测平台功能。

此函数是异步的。可以通过连接到 stateChanged()、opened() 或 error() 信号来查询结果。

3、[signal] void closed()

当网络会话关闭时发出此信号。

4、[signal] void error(QNetworkSession::SessionError error)

发生错误后发出此信号。 error 参数描述了发生的错误。

connect(networkSession, QOverload<QNetworkSession::SessionError>::of(&QNetworkSession::error),[=](QNetworkSession::SessionError error)
{});

5、void ignore()

此函数表示应用程序不希望漫游会话。

6、void migrate()

指示会话漫游到新的接入点。旧的接入点一直保持活动状态,直到应用程序调用 accept()。一旦漫游完成,就会发出 newConfigurationActivated() 信号。

7、[signal] void newConfigurationActivated()

一旦会话漫游到新的接入点,就会发出这个信号。应用程序可以重新打开其套接字并测试新网络链接的适用性。 随后它必须accept()或reject()新的接入点。

8、void open()

创建一个打开的会话,增加底层网络接口上的会话计数器。在会话引用计数器达到零之前,系统不会终止网络接口。 因此,开放会话允许应用程序注册其对接口的使用。

作为调用 open() 的结果,如果接口尚未连接/启动,则该接口将被启动。某些平台可能不支持进程外会话。 在此类平台上,会话计数器会忽略其他进程持有的任何会话。可以通过 QNetworkConfigurationManager::capabilities() 检测平台功能。

此函数是异步的。可以通过连接到 stateChanged()、opened() 或 error() 信号来查询结果。

9、[signal] void opened()

当网络会话打开时发出此信号。

只要会话保持打开状态,底层网络接口就不会关闭。此功能取决于系统范围的会话支持。

10、[signal] void preferredConfigurationChanged(const QNetworkConfiguration &config, bool isSeamless)

当会话的首选配置/接入点更改时,会发出此信号。只有基于QNetworkConfiguration::ServiceNetwork的会话才能发出此信号。config 可用于确定接入点特定的详细信息,例如代理设置,并且 isSeamless 指示漫游是否会破坏会话 IP 地址。

作为此信号的结果,应用程序必须通过调用 migrate() 或选择 ignore() 新接入点来启动漫游过程。

某些平台可能支持强制漫游和应用级漫游 (ALR) 的概念。

  • 强制漫游意味着平台可以简单地漫游到新配置而无需咨询应用程序。由应用程序来检测链路层丢失并重新建立其socket。
  • ALR 防止系统漫游。

如果此会话基于支持漫游的配置,则应用程序可以通过连接到此信号来选择是否要咨询(ALR 用例)。只要该信号连接保持不变,会话就保持注册为漫游涉众,否则平台将强制漫游。

11、void reject()

新接入点不适合该应用程序。通过调用这个函数,会话返回到之前的接入点/配置。 

12、[signal] void stateChanged(QNetworkSession::State state)

每当网络会话的状态发生变化时,就会发出此信号。参数是新状态。

13、void stop()

使针对网络接口的所有打开会话无效,从而停止底层网络接口。 此函数始终将会话的 state() 标志更改为Disconnected。

14、[signal] void usagePoliciesChanged(QNetworkSession::UsagePolicies usagePolicies)

当系统修改QNetworkSession::UsagePolicy时,会发出此信号。

15、quint64 activeTime()

返回会话处于活动状态的秒数。

16、quint64 bytesReceived()

返回接收到的数据量(以字节为单位)。此字段值包括使用相同网络接口的所有开放网络会话的使用情况。如果会话基于QNetworkConfiguration::ServiceNetwork配置,则返回所有活动成员配置中发送的字节数。

此函数可能并非总是在所有平台上都受支持并返回 0。可以通过 QNetworkConfigurationManager::DataStatistics 检测平台功能。

17、quint64 bytesWritten()

返回以字节为单位发送的数据量。此字段值包括使用相同网络接口的所有开放网络会话的使用情况。如果会话基于QNetworkConfiguration::ServiceNetwork配置,则返回所有活动成员配置中发送的字节数。

此函数可能并非总是在所有平台上都受支持并返回 0。可以通过 QNetworkConfigurationManager::DataStatistics 检测平台功能。

18、QNetworkConfiguration configuration()

返回此网络会话对象所基于的 QNetworkConfiguration。

19、QNetworkInterface interface()

返回此会话使用的网络接口。此函数仅在此会话已连接时返回有效的网络接口。返回的接口可能会因漫游过程而改变。

20、bool isOpen()

如果此会话已打开,则返回 true。 如果所有打开的会话数大于零,则底层网络接口将保持连接/开启。会话可以通过 open() 和 close() 进行控制。

21、QVariant sessionProperty(const QString &key) 

返回属性键的值。网络会话可以附加属性,这些属性可以更详细地描述会话。 此函数可用于访问这些属性。

属性键如下:

     QNetworkConfigurationManager mgr;
     QNetworkConfiguration ap = mgr.defaultConfiguration();
     QNetworkSession *session = new QNetworkSession(ap);

     QString ident = session->sessionProperty("ActiveConfiguration").toString();
     if ( ap.type() == QNetworkConfiguration::ServiceNetwork )
     {
         Q_ASSERT( ap.identifier() != ident );
         Q_ASSERT( ap.children().contains( mgr.configurationFromIdentifier(ident) ) );
     } 
     else if ( ap.type() == QNetworkConfiguration::InternetAccessPoint ) 
     {
         Q_ASSERT( ap.identifier() == ident );
     }

22、void setSessionProperty(const QString &key, const QVariant &value)

设置会话的属性值。可以通过传递无效的 QVariant 来移除已经设置的属性。请注意,UserChoiceConfiguration 和 ActiveConfiguration 属性是只读的,不能使用此方法更改。

23、QNetworkSession::State state()

返回会话的状态。

如果会话基于单个接入点配置,则会话状态与关联网络接口的状态相同。 因此,网络会话对象可用于监视网络接口。

基于 QNetworkConfiguration::ServiceNetwork 的会话总结其所有子级的状态,因此如果至少有一个服务网络的 QNetworkConfiguration::children() 配置处于活动状态,则返回 Connected 状态。

请注意,不需要为了获取网络接口状态而保持打开会话。已连接但已关闭的会话可用于监视网络接口,而打开且已连接的会话对象可防止网络接口被关闭。

24、bool waitForOpened(int msecs = 30000)

等待直到会话打开,最多 msecs 毫秒。如果会话已打开此函数返回 true。在返回false的情况下,可以调用error()来确定错误的原因。如果 msecs 为 -1,则此函数不会超时。

以下示例最多等待一秒钟以打开会话:

     session->open();
     if (session->waitForOpened(1000))
         qDebug("Open!");

标签:接入点,Qt,QNetworkSession,编程,应用程序,会话,QNetworkConfiguration,漫游,网络接口
来源: https://blog.csdn.net/kenfan1647/article/details/118436272