一、描述
QNetworkProxy 提供了为 Qt 网络类配置网络层代理支持的方法。当前支持的类有 QAbstractSocket、QTcpSocket、QUdpSocket、QTcpServer、QNetworkAccessManager。代理支持被设计为尽可能透明。使用以下代码使应用程序自动支持网络代理:
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 与 QUdpSocket 和 QTcpServer 一起使用时的记住事项:
- 使用 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)
如果此代理正在使用已知网络请求头,则返回该请求头的值。
此代理是否支持 CachingCapability(缓存功能) 功能。
此代理是否支持 TunnelingCapability(隧道功能)功能。
6、[static] void setApplicationProxy(const QNetworkProxy &networkProxy)
设置应用程序级网络代理。如果 QAbstractSocket 具有 QNetworkProxy::DefaultProxy 类型,则使用此函数设置的 QNetworkProxy(已连接的断开连重连才能生效)。使用此函数设置默认代理值将覆盖使用 QNetworkProxyFactory::setApplicationProxyFactory() 设置的应用程序代理工厂,并禁用系统代理。
略去设置和获取封装数据的函数。