QNetworkProxy 类

QNetworkProxy 类提供网络层代理功能。更多...

头文件 #include <QNetworkProxy>
CMakefind_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
qmakeQT += network

注意: 此类中所有函数都是可重入的。

公共类型

flags能力
枚举能力 { 通道能力,监听能力,UDP 通道能力,缓存能力,主机名查找能力,…,Sctp 监听能力 }
枚举代理类型 { 无代理,默认代理,Socks5 代理,Http 代理,Http 缓存代理,Ftp 缓存代理 }

公共函数

QNetworkProxy()
QNetworkProxy(QNetworkProxy::ProxyType type, const QString &hostName = QString(), quint16 port = 0, const QString &user = QString(), const QString &password = QString())
QNetworkProxy(const QNetworkProxy &other)
~QNetworkProxy()
QNetworkProxy::Capabilitiescapabilities() const
boolhasRawHeader(const QByteArray &headerName) const
QVariantheader(QNetworkRequest::KnownHeaders header) const
QStringhostName() const
boolisCachingProxy() const
boolisTransparentProxy() const
QStringpassword() const
quint16port() const
QByteArrayrawHeader(const QByteArray &headerName) const
QList<QByteArray>rawHeaderList() const
voidsetCapabilities(QNetworkProxy::Capabilities capabilities)
voidsetHeader(QNetworkRequest::KnownHeaders header, const QVariant &value)
voidsetHostName(const QString &hostName)
voidsetPassword(const QString &password)
voidsetPort(quint16 port)
voidsetRawHeader(const QByteArray &headerName, const QByteArray &headerValue)
voidsetType(QNetworkProxy::ProxyType type)
voidsetUser(const QString &user)
voidswap(QNetworkProxy &other)
QNetworkProxy::ProxyType类型() const
QString用户() const
booloperator!=(const QNetworkProxy &;《i》 other)const
QNetworkProxy &;operator=(const QNetworkProxy &;《i》 other)
booloperator==(const QNetworkProxy &;《i》 other)const

静态公共成员

QNetworkProxyapplicationProxy()
voidsetApplicationProxy(const QNetworkProxy &;《i》 networkProxy)

详细说明

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);

设置应用代理的另一种方法是使用 QAbstractSocket::setProxy() 和 QTcpServer::setProxy() 指定个别套接字的代理。这样,可以使用以下代码禁用特定套接字使用代理:

serverSocket->setProxy(QNetworkProxy::NoProxy);

如果 connectToHost()、bind() 或 listen() 使用的地址等效于 QHostAddress::LocalHostQHostAddress::LocalHostIPv6,则不使用网络代理。

每种类型的代理支持都与某些限制相关联。在选择要使用的代理类型之前,请仔细阅读 ProxyType 文档。

注意:目前连接的套接字上的更改不会生效。如果您需要更改连接的套接字,则应重新连接它。

SOCKS5

Qt 4 及以后的 SOCKS5 支持基于 RFC 1928RFC 1929。支持的认证方法是无认证和用户名/密码认证。支持 IPv4 和 IPv6。如果启用 QNetworkProxy::HostNameLookupCapability,则域名将通过 SOCKS5 服务器解析,否则将本地解析并将 IP 地址发送到服务器。使用 SOCKS5 与 QUdpSocketQTcpServer 一起使用时,有一些需要注意的事项:

在使用 QUdpSocket 时,调用 bind() 可能会因为超时而失败。如果传递给 bind() 的端口号不是 0,则不能保证使用的是指定的端口号。使用 localPort() 和 localAddress() 获取实际使用的地址和端口号。因为通过代理的 UDP 通过两个 UDP 连接进行,因此数据包丢失的可能性更大。

使用 QTcpServer,对 listen() 方法的调用可能会因超时错误而失败。如果向 listen() 方法传入的不是 0 的端口号,则不能保证使用的是指定的端口。请使用 serverPort() 和 serverAddress() 来获取实际用于监听连接的地址和端口。SOCKS5 只支持每个 listen() 调用接受一个连接,并且每个调用可能使用不同的 serverPort()。

另请参阅QAbstractSocketQTcpServer

成员类型文档

枚举 QNetworkProxy::Capability
标志 QNetworkProxy::Capabilities

这些标志指示给定的代理服务器支持的功能。

QNetworkProxy 在创建对象时默认设置不同的功能(有关默认值列表,请参阅 QNetworkProxy::ProxyType)。然而,可以使用 setCapabilities() 在对象创建后更改这些功能。

QNetworkProxy 支持的功能有

常量描述
QNetworkProxy::TunnelingCapability0x0001能够为远程主机打开透明、隧道化的 TCP 连接。代理服务器直接传送两边的数据,不进行缓存。
QNetworkProxy::ListeningCapability0x0002能够在远程主机上创建监听套接字并等待来自远程主机的 TCP 连接。
QNetworkProxy::UdpTunnelingCapability0x0004能够通过代理服务器中继来自和指向远程主机的 UDP 数据报。
QNetworkProxy::CachingCapability0x0008能够缓存传输的内容。此功能特定于每个协议和代理类型。例如,HTTP 代理可以缓存使用 "GET" 命令传输的网页数据。
QNetworkProxy::HostNameLookupCapability0x0010能够连接到远程主机名进行查询并连接到它,而不是要求应用程序只对 IP 地址执行名称查询并请求连接。
QNetworkProxy::SctpTunnelingCapability0x00020能够为远程主机打开透明、隧道化的 SCTP 连接。
QNetworkProxy::SctpListeningCapability0x00040能够在远程主机上创建监听套接字并等待来自远程主机的 SCTP 连接。

Capabilities 类型是 QFlags<Capability> 的 typedef。它存储了一个或操作 Capability 值。

枚举 QNetworkProxy::ProxyType

此枚举描述了 Qt 提供的网络代理类型。

Qt 理解两种代理类型:透明代理和缓存代理。第一组包括可以处理任何任意数据传输的代理,而第二组只能处理特定请求。缓存代理只适用于可以使用的特定类。

常量描述
QNetworkProxy::NoProxy2不使用代理
QNetworkProxy::DefaultProxy0代理由应用程序使用 setApplicationProxy() 设置的代理确定
QNetworkProxy::Socks5Proxy1使用 Socks5 代理
QNetworkProxy::HttpProxy3使用 HTTP 透明代理
QNetworkProxy::HttpCachingProxy4仅代理 HTTP 请求
QNetworkProxy::FtpCachingProxy5仅代理FTP请求

下表列出了不同类型的代理及它们的特性。由于每种代理类型的功能不同,在选择代理类型之前理解它们是非常重要的。

代理类型描述默认特性
SOCKS 5通用的任意类型连接代理。支持TCP、UDP、绑定到端口(入站连接)和认证。隧道能力监听能力UDP隧道能力域名解析能力
HTTP使用“CONNECT”命令实现,仅支持出站TCP连接;支持认证。隧道能力缓存能力域名解析能力
仅缓存HTTP使用正常的HTTP命令实现,仅在HTTP请求的上下文中非常有用(见QNetworkAccessManager缓存能力域名解析能力
缓存FTP使用FTP代理实现,仅在FTP请求的上下文中非常有用(见QNetworkAccessManager缓存能力域名解析能力

还请注意,不要将应用程序默认代理(setApplicationProxy())设置为没有隧道能力功能的代理。如果这样做,QTcpSocket将不知道如何打开连接。

另请参阅setType(),type(),capabilities()和setCapabilities()。

成员函数文档

QNetworkProxy::QNetworkProxy()

使用默认代理类型DefaultProxy构造QNetworkProxy。

代理类型由applicationProxy决定,默认为NoProxy或者系统范围内的代理(如果已配置)。

另请参阅setTypesetApplicationProxy()。

QNetworkProxy::QNetworkProxy(QNetworkProxy::ProxyType type, const QString &hostName = QString(), quint16 port = 0, const QString &user = Quran(), const QString &password = QString())

使用类型、主机名、端口、用户和密码构造QNetworkProxy。

代理类型的默认特性将自动设置。

另请参阅capabilities()。

QNetworkProxy::QNetworkProxy(const QNetworkProxy &other)

构建其它的一个副本。

[noexcept] QNetworkProxy::~QNetworkProxy()

销毁QNetworkProxy对象。

[static] QNetworkProxy QNetworkProxy::applicationProxy()

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

如果QAbstractSocketQTcpSocket具有QNetworkProxy::DefaultProxy类型,则该函数返回的QNetworkProxy将被使用。

另请参阅QNetworkProxyFactorysetApplicationProxy()QAbstractSocket::proxy()和QTcpServer::proxy()。

QNetworkProxy::Capabilities QNetworkProxy::capabilities() const

返回此代理服务器的功能。

另请参阅setCapabilities()和type()。

bool QNetworkProxy::hasRawHeader(const QByteArray &headerName) const

如果未使用原始头headerName,则返回true。如果代理不是HttpProxyHttpCachingProxy类型,则返回false

另请参阅rawHeader()和setRawHeader()。

如果未使用已知网络头header,则返回QVariant()(即,一个无效的版本)。

另请参阅QNetworkRequest::KnownHeadersrawHeader()和setHeader()。

QString QNetworkProxy::hostName() const

返回代理主机的主机名。

另请参阅setHostName()、setPort()和port()。

bool QNetworkProxy::isCachingProxy() const

如果此代理支持QNetworkProxy::CachingCapability功能,则返回true

在Qt 4.4中,此功能与代理类型相关联,但自Qt 4.5以来,可以通过调用setCapabilities(),从代理中删除缓存功能。

另请参阅capabilities()、type()和isTransparentProxy()。

bool QNetworkProxy::isTransparentProxy() const

如果此代理支持通过网络连接进行透明隧道传输,则返回true。这与QNetworkProxy::TunnelingCapability功能相对应。

在Qt 4.4中,此功能与代理类型相关联,但自Qt 4.5以来,可以通过调用setCapabilities(),从代理中删除缓存功能。

另请参阅capabilities()、type()和isCachingProxy()。

QString QNetworkProxy::password() const

返回用于认证的密码。

另请参阅 user(),setPassword(),和setUser()。

quint16 QNetworkProxy::port() const

返回代理主机的端口号。

另请参阅 setHostName(),setPort(),和hostName()。

QByteArray QNetworkProxy::rawHeader(const QByteArray &headerName) const

返回头 headerName 的原始形式。如果没有这样的头或代理类型不是HttpProxyHttpCachingProxy,则返回一个空的QByteArray,这可能无法与没有内容的头区分开来(使用hasRawHeader()来确定头是否存在)。

可以使用setRawHeader()或setHeader()来设置原始头。

另请参阅 header()和setRawHeader()。

QList<QByteArray> QNetworkProxy::rawHeaderList() const

返回在此网络代理中设置的所有原始头的列表。列表是按照设置头的顺序排列的。

如果代理类型不是HttpProxyHttpCachingProxy,则返回一个空的QList

另请参阅 hasRawHeader()和rawHeader()。

[静态] void QNetworkProxy::setApplicationProxy(const QNetworkProxy &networkProxy)

设置应用程序级别网络代理为networkProxy

如果QAbstractSocketQTcpSocket的类型是QNetworkProxy::DefaultProxy,则使用此函数设置的QNetworkProxy。如果需要在确定使用哪个代理方面有更多灵活性,请使用QNetworkProxyFactory类。

使用此函数设置默认代理值将覆盖使用QNetworkProxyFactory::setApplicationProxyFactory设置的代理工厂,并禁用系统代理的使用。

另请参阅 QNetworkProxyFactoryapplicationProxyQAbstractSocket::setProxy,和QTcpServer::setProxy

void QNetworkProxy::setCapabilities(QNetworkProxy::Capabilities capabilities)

将此代理的功能设置为capabilities

另请参阅 setType()和capabilities()。

void QNetworkProxy::setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value)

将已知头header的值设置为value,覆盖之前设置的任何头。此操作还设置等效的原始HTTP头。

如果代理不是类型HttpProxyHttpCachingProxy,则此设置无效。

另请参阅QNetworkRequest::KnownHeaderssetRawHeader()以及header()。

void QNetworkProxy::setHostName(const QString &hostName)

将代理主机的主机名设置为hostName

另请参阅hostNamesetPortport

void QNetworkProxy::setPassword(const QString &password)

将代理身份验证的密码设置为password

另请参阅usersetUserpassword

void QNetworkProxy::setPort(quint16 port)

将代理主机端设置为port

另请参阅hostNamesetHostNameport

void QNetworkProxy::setRawHeader(const QByteArray &headerName, const QByteArray &headerValue)

将头部headerName设置为值headerValue。如果headerName对应于已知头部(请参阅QNetworkRequest::KnownHeaders),则会解析原始格式,并将对应的"熟"头也设置为。

例如

request.setRawHeader(QByteArray("Last-Modified"), QByteArray("Sun, 06 Nov 1994 08:49:37 GMT"));

也将已知头部LastModifiedHeader设置为解析的日期的QDateTime对象。

注意:多次设置相同的头部会覆盖之前的设置。如果想完成多个具有相同名称的HTTP头,应该将两个值用逗号(",")分隔,并设置一个单一的原始头。

如果代理不是类型HttpProxyHttpCachingProxy,则此设置无效。

另请参阅QNetworkRequest::KnownHeaderssetHeaderhasRawHeaderrawHeader

void QNetworkProxy::setType(QNetworkProxy::ProxyType type)

将此实例的代理类型设置为type

注意,更改代理类型不会更改此QNetworkProxy对象拥有的能力集合,如果已经通过setCapabilities设置了任何能力。

另请参阅type()和setCapabilities

void QNetworkProxy::setUser(const QString &user)

将代理身份验证的用户名设置为user

另请参阅usersetPasswordpassword

[noexcept] void QNetworkProxy::swap(QNetworkProxy &other)

交换此网络代理实例与other。此函数执行速度快且不会失败。

QNetworkProxy::ProxyType QNetworkProxy::type() const

返回此实例的代理类型。

另请参阅 setType().

QString QNetworkProxy::user() const

返回用于身份验证的用户名。

另请参阅 setUser(),setPassword()以及password().

bool QNetworkProxy::operator!=(const QNetworkProxy &other) const

比较此网络代理实例与other的值,如果它们不同则返回true

QNetworkProxy &QNetworkProxy::operator=(const QNetworkProxy &other)

将网络代理other的值分配给此网络代理。

bool QNetworkProxy::operator==(const QNetworkProxy &other) const

比较此网络代理实例与other的值,如果它们相等(相同的代理类型,服务器以及用户名和密码)则返回true

© 2024 The Qt Company Ltd. 文档贡献归各自所有者所有。提供的文档受GNU自由文档许可协议第1.3版的条款约束,由自由软件基金会发布。Qt和相应的标志是芬兰以及/或其他国家的The Qt Company Ltd.的商标。所有其他商标归各自所有者所有。