Qt网络编程:QNetworkProxy

一、描述

QNetworkProxy 提供了为 Qt 网络类配置网络层代理支持的方法。当前支持的类有 QAbstractSocketQTcpSocketQUdpSocketQTcpServerQNetworkAccessManager。代理支持被设计为尽可能透明。使用以下代码使应用程序自动支持网络代理:

    QNetworkProxy proxy;
    proxy.setType(QNetworkProxy::Socks5Proxy);
    proxy.setHostName("proxy.example.com");
    proxy.setPort(1080);
    proxy.setUser("username");
    proxy.setPassword("password");
    QNetworkProxy::setApplicationProxy(proxy);

 

此类封装的内部数据:

1.1、SOCKS5代理协议

Qt支持SOCKS5代理协议。支持的身份验证方法是无身份验证、用户名/密码身份验证。支持 IPv4 和 IPv6。

如果启用了 QNetworkProxy::HostNameLookupCapability,则域名通过 SOCKS5 服务器解析,否则在本地解析并将 IP 地址发送到服务器。

将 SOCKS5 与 QUdpSocketQTcpServer 一起使用时的记住事项:

  • 使用 QUdpSocket,对 bind() 的调用可能会因超时错误而失败。如果将 0 以外的端口号传递给 bind(),则不能保证它是将使用的指定端口。使用 localPort() 和 localAddress() 获取实际使用的地址和端口号。由于代理的 UDP 通过两个 UDP 连接,因此更有可能丢弃数据包。
  • 使用 QTcpServer 调用 listen() 可能会因超时错误而失败。如果将 0 以外的端口号传递给 listen(),则不能保证它是将使用的指定端口。使用 serverPort() 和 serverAddress() 获取用于侦听连接的实际地址和端口。 SOCKS5 每次调用 listen() 仅支持一个已接受的连接,并且每次调用都可能导致使用不同的 serverPort()。

二、类型成员

1、QNetworkProxy::Capability:这些标志指示给定代理服务器支持的功能。

  • TunnelingCapability(隧道功能):能够打开到远程主机的透明(透明代理见:HTTP代理服务器的工作原理)、隧道(隧道:通过特定的通讯方法找到特定的目标)化的 TCP 连接代理。代理服务器逐字节地将传输从一侧中继到另一侧并且不进行缓存。
  • ListeningCapability(监听功能):能够创建侦听socket并等待来自远程主机的传入 TCP 连接。
  • UdpTunnelingCapability(Udp隧道功能):能够通过代理服务器与远程主机传递 UDP 数据报。
  • CachingCapability(缓存功能):能够缓存传输的内容。 此功能特定于每个协议和代理类型。例如,HTTP 代理可以缓存使用“GET”命令传输的 Web 数据的内容。
  • HostNameLookupCapability(主机名查找功能):能够对远程主机名执行查找并连接到它,而不是要求应用程序仅执行名称查找并请求连接到IP地址。
  • SctpTunnelingCapability(Sctp隧道功能):能够打开到远程主机的透明隧道 SCTP 连接。
  • SctpListeningCapability(Sctp 监听功能):能够创建侦听socket并等待来自远程主机的传入 SCTP 连接。

2、QNetworkProxy::ProxyType:该枚举描述了 Qt 中提供的网络代理类型。Qt 可以理解两种类型的代理:透明代理和缓存代理。 第一组由可以处理任意数据传输的代理组成,而第二组只能处理特定请求。 缓存代理仅对可以使用它们的特定类有意义。

  • NoProxy:未使用代理。
  • DefaultProxy:使用setApplicationProxy()确定代理。
  • Socks5Proxy:使用 Socks5 代理。
  • HttpProxy:使用 HTTP 透明代理。
  • HttpCachingProxy:仅代理 HTTP 请求。
  • FtpCachingProxy:仅代理 FTP 请求。

2.1、代理种类及其功能。

1、SOCKS5

任何类型连接的通用代理。 支持 TCP、UDP、绑定到端口(传入连接)和身份验证。

支持的功能:TunnelingCapability(隧道功能)ListeningCapability(监听功能)UdpTunnelingCapability(Udp隧道功能)HostNameLookupCapability(主机名查找功能)

2、HTTP

仅支持传出TCP连接; 支持身份验证。

支持的功能:TunnelingCapability(隧道功能)CachingCapability(缓存功能)HostNameLookupCapability(主机名查找功能)

3、Caching-only HTTP

仅在 HTTP 请求的上下文中有用(QNetworkAccessManager)。

支持的功能:CachingCapability(缓存功能)HostNameLookupCapability(主机名查找功能)

4、Caching FTP

仅在 FTP 请求的上下文中有用(QNetworkAccessManager)。

支持的功能:CachingCapability(缓存功能)HostNameLookupCapability(主机名查找功能)

三、成员函数

1、[static] QNetworkProxy applicationProxy()

返回应用程序级网络代理。

2、bool hasRawHeader(const QByteArray &headerName)

如果参数中的请求头正在用于此代理,则返回 true。如果代理不是 HttpProxy HttpCachingProxy 类型,则返回 false。

3、QVariant header(QNetworkRequest::KnownHeaders header)

如果此代理正在使用已知网络请求头,则返回该请求头的值。

4、bool isCachingProxy()

此代理是否支持 CachingCapability(缓存功能) 功能。

5、bool isTransparentProxy()

此代理是否支持 TunnelingCapability(隧道功能)功能。

6、[static] void setApplicationProxy(const QNetworkProxy &networkProxy)

设置应用程序级网络代理。如果 QAbstractSocket 具有 QNetworkProxy::DefaultProxy 类型,则使用此函数设置的 QNetworkProxy(已连接的断开连重连才能生效)。使用此函数设置默认代理值将覆盖使用 QNetworkProxyFactory::setApplicationProxyFactory() 设置的应用程序代理工厂,并禁用系统代理。

略去设置和获取封装数据的函数。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中进行网络编程,主要涉及到的头文件有**<QTcpSocket>和<QTcpServer>**。以下是一些关于Qt网络编程的信息: 1. **客户端编程**: - **创建QTcpSocket对象**:用于建立与服务器的连接。 - **连接至服务器**:使用`connectToHost()`函数连接到指定的服务器。 - **发送数据**:通过`write()`函数来发送数据到服务器。 - **读取数据**:使用`readAll()`函数来接收来自服务器的数据。 - **断开连接**:完成数据传输后,需要断开与服务器的连接。 2. **服务器端编程**: - **创建QTcpServer对象**:用于监听客户端的连接请求。 - **绑定本地信息**:通过调用`listen()`函数并指定地址和端口来开始监听。 - **等待客户端连接**:当有新的连接请求时,`newConnection()`信号会被触发。 - **读取和发送数据**:与客户端类似,服务器也需要读取和发送数据。 - **断开连接**:结束客户端的连接。 3. **头文件引入**: - 对于客户端,需要包含`#include <QTcpSocket>`。 - 对于服务器,需要包含`#include <QTcpServer>`。 4. **项目文件配置**: - 在项目的`.pro`文件中,需要添加`QT += network`以启用网络模块。 5. **数据流操作**: - 在进行数据收发时,可以使用`QDataStream`类来处理数据流,它提供了一种方便的方式来序列化和反序列化数据。 综上所述,这些是Qt网络编程的基本概念和步骤。在实际开发中,还需要考虑到错误处理、多线程管理以及安全性等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值