QNetworkProxy Class
QNetworkProxy 类提供了一个网络层代理。更多内容...
| 头文件: | #include <QNetworkProxy> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Network) target_link_libraries(mytarget PRIVATE Qt6::Network) |
| qmake: | QT += network |
- 所有成员列表,包括继承的成员
- QNetworkProxy 属于网络编程 API 和隐式共享类。
注意:该类中的所有函数均为可重入的。
公共类型
| flags | Capabilities |
| enum | Capability { TunnelingCapability, ListeningCapability, UdpTunnelingCapability, CachingCapability, HostNameLookupCapability, …, SctpListeningCapability } |
| enum | ProxyType { NoProxy, DefaultProxy, Socks5Proxy, HttpProxy, HttpCachingProxy, FtpCachingProxy } |
公共函数
| 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::Capabilities | capabilities() const |
| bool | hasRawHeader(const QByteArray &headerName) const |
| QVariant | header(QNetworkRequest::KnownHeaders header) const |
(since 6.8) QHttpHeaders | headers() const |
| QString | hostName() const |
| bool | isCachingProxy() const |
| bool | isTransparentProxy() const |
| QString | password() const |
| quint16 | port() const |
| QByteArray | rawHeader(const QByteArray &headerName) const |
| QList<QByteArray> | rawHeaderList() const |
| void | setCapabilities(QNetworkProxy::Capabilities capabilities) |
| void | setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value) |
(since 6.8) void | setHeaders(QHttpHeaders &&newHeaders) |
(since 6.8) void | setHeaders(const QHttpHeaders &newHeaders) |
| void | setHostName(const QString &hostName) |
| void | setPassword(const QString &password) |
| void | setPort(quint16 port) |
| void | setRawHeader(const QByteArray &headerName, const QByteArray &headerValue) |
| void | setType(QNetworkProxy::ProxyType type) |
| void | setUser(const QString &user) |
| void | swap(QNetworkProxy &other) |
| QNetworkProxy::ProxyType | type() const |
| QString | user() const |
| bool | operator!=(const QNetworkProxy &other) const |
| QNetworkProxy & | operator=(const QNetworkProxy &other) |
| bool | operator==(const QNetworkProxy &other) const |
静态公共成员
| QNetworkProxy | applicationProxy() |
| void | setApplicationProxy(const QNetworkProxy &networkProxy) |
详细说明
QNetworkProxy 为 Qt Network 类提供了配置网络层代理支持的方法。目前支持的类包括: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);除了设置全局代理外,还可以通过 `QAbstractSocket::setProxy()` 和 `QTcpServer::setProxy()` 为单个套接字指定代理。通过这种方式,可以使用以下代码禁用特定套接字的代理功能:
serverSocket->setProxy(QNetworkProxy::NoProxy);如果connectToHost()、bind() 或listen() 中使用的地址等同于QHostAddress::LocalHost 或QHostAddress::LocalHostIPv6 ,则不会使用网络代理。
每种代理支持类型都有相应的限制。在选择要使用的代理类型之前,请仔细阅读ProxyType 文档。
注意: 对当前已连接的套接字所做的更改 不会生效。若需修改已连接的套接字,应重新建立连接。
SOCKS5
自 Qt 4 起,SOCKS5 支持基于RFC 1928和RFC 1929。支持的认证方法包括无认证和用户名/密码认证。同时支持 IPv4 和 IPv6。 如果启用了QNetworkProxy::HostNameLookupCapability ,域名将通过SOCKS5服务器解析;否则,域名将在本地解析,并将IP地址发送给服务器。在将SOCKS5与QUdpSocket 和QTcpServer 配合使用时,有几点需要注意:
启用QUdpSocket 时,调用bind()可能会因超时而失败。如果向bind()传递的端口号不为0,则无法保证实际使用的端口就是指定的端口。 请使用localPort() 和localAddress() 获取实际使用的地址和端口号。由于代理 UDP 需经过两个 UDP 连接,因此数据包被丢弃的可能性更高。
在QTcpServer 中,对listen()的调用可能会因超时错误而失败。如果向listen()传递的端口号不为0,则不能保证实际使用的正是该指定端口。请使用serverPort()和serverAddress()来获取实际用于监听连接的地址和端口。 SOCKS5 仅支持每次调用listen() 时接受一个连接,且每次调用很可能使用不同的serverPort()。
另请参阅 QAbstractSocket 和QTcpServer 。
成员类型文档
enum QNetworkProxy::Capability
flags QNetworkProxy::Capabilities
这些标志表示给定代理服务器支持的功能。
QNetworkProxy 在创建对象时,系统会默认设置不同的功能(默认设置列表请参见QNetworkProxy::ProxyType )。不过,在对象创建后,可以通过setCapabilities() 来更改这些功能。
QNetworkProxy 支持的功能包括:
| 常量 | 值 | 描述 |
|---|---|---|
QNetworkProxy::TunnelingCapability | 0x0001 | 能够与远程主机建立透明的隧道式 TCP 连接。代理服务器将数据原样从一端中继到另一端,且不进行缓存。 |
QNetworkProxy::ListeningCapability | 0x0002 | 能够创建一个监听套接字,并等待来自远程主机的传入 TCP 连接。 |
QNetworkProxy::UdpTunnelingCapability | 0x0004 | 能够通过代理服务器中继 UDP 数据报,在远程主机之间进行传输。 |
QNetworkProxy::CachingCapability | 0x0008 | 能够缓存传输的内容。此功能因协议和代理类型而异。例如,HTTP 代理可以缓存通过“GET”命令传输的 Web 数据内容。 |
QNetworkProxy::HostNameLookupCapability | 0x0010 | 能够连接以对远程主机名进行查询并与其建立连接,而非要求应用程序仅执行名称查询并请求连接到 IP 地址。 |
QNetworkProxy::SctpTunnelingCapability | 0x00020 | 能够与远程主机建立透明的、隧道化的 SCTP 连接。 |
QNetworkProxy::SctpListeningCapability | 0x00040 | 能够创建监听套接字,并等待来自远程主机的传入 SCTP 连接。 |
Capabilities 类型是QFlags<Capability> 的 typedef 定义。它存储 Capability 值的按“或”运算组合。
enum QNetworkProxy::ProxyType
该枚举描述了 Qt Network 中提供的网络代理类型。
Qt 支持两种类型的代理:透明代理和缓存代理。第一类代理能够处理任意数据传输,而第二类则仅能处理特定请求。缓存代理仅在可应用它们的特定类中才有意义。
| 常量 | 值 | 描述 |
|---|---|---|
QNetworkProxy::NoProxy | 2 | 不使用代理 |
QNetworkProxy::DefaultProxy | 0 | 代理由通过setApplicationProxy()设置的应用程序代理决定 |
QNetworkProxy::Socks5Proxy | 1 | Socks5 使用代理 |
QNetworkProxy::HttpProxy | 3 | 使用 HTTP 透明代理 |
QNetworkProxy::HttpCachingProxy | 4 | 仅对 HTTP 请求进行代理 |
QNetworkProxy::FtpCachingProxy | 5 | 仅对 FTP 请求进行代理 |
下表列出了不同的代理类型及其功能。由于每种代理类型的功能各不相同,因此在选择代理类型之前,了解这些功能非常重要。
| 代理类型 | 描述 | 默认功能 |
|---|---|---|
| SOCKS 5 | 适用于任何类型连接的通用代理。支持 TCP、UDP、端口绑定(传入连接)以及身份验证。 | TunnelingCapability、ListeningCapability 、UdpTunnelingCapability 、HostNameLookupCapability |
| HTTP | 通过“CONNECT”命令实现,仅支持出站 TCP 连接;支持身份验证。 | TunnelingCapability,CachingCapability,HostNameLookupCapability |
| 仅缓存的 HTTP | 使用常规HTTP命令实现,仅在HTTP请求的上下文中有效(参见QNetworkAccessManager ) | CachingCapability,HostNameLookupCapability |
| 仅缓存 FTP | 通过FTP代理实现,仅在FTP请求场景下有效(参见QNetworkAccessManager ) | CachingCapability,HostNameLookupCapability |
另请注意,不应将应用程序默认代理(setApplicationProxy()) 设置为不具备TunnelingCapability 功能的代理。否则,QTcpSocket 将无法建立连接。
另请参阅 setType()、type()、capabilities() 以及setCapabilities()。
成员函数文档
QNetworkProxy::QNetworkProxy()
创建一个类型为DefaultProxy 的QNetworkProxy。
代理类型由applicationProxy() 确定,其默认值为NoProxy ,或者如果已配置系统级代理,则为该系统级代理。
另请参阅 setType() 和setApplicationProxy()。
QNetworkProxy::QNetworkProxy(QNetworkProxy::ProxyType type, const QString &hostName = QString(), quint16 port = 0, const QString &user = QString(), const QString &password = QString())
使用type 、hostName 、port 、user 和password 构建一个 QNetworkProxy。
代理类型type 的默认功能将自动设置。
另请参阅 capabilities()。
QNetworkProxy::QNetworkProxy(const QNetworkProxy &other)
创建other 的副本。
[noexcept] QNetworkProxy::~QNetworkProxy()
销毁QNetworkProxy 对象。
[static] QNetworkProxy QNetworkProxy::applicationProxy()
返回应用程序级别的网络代理功能。
如果QAbstractSocket 或QTcpSocket 的类型为QNetworkProxy::DefaultProxy ,则使用该函数返回的QNetworkProxy 。
另请参阅 QNetworkProxyFactory 、setApplicationProxy()、QAbstractSocket::proxy() 和QTcpServer::proxy()。
QNetworkProxy::Capabilities QNetworkProxy::capabilities() const
返回此代理服务器的功能。
另请参阅 setCapabilities() 和type()。
bool QNetworkProxy::hasRawHeader(const QByteArray &headerName) const
如果该代理正在使用原始头文件headerName ,则返回true 。如果该代理不是类型HttpProxy 或HttpCachingProxy ,则返回false 。
另请参阅 rawHeader() 和setRawHeader()。
QVariant QNetworkProxy::header(QNetworkRequest::KnownHeaders header) const
如果该已知网络头header 正在被此代理使用,则返回其值。如果不存在,则返回QVariant()(即一个无效的变体)。
另请参阅 QNetworkRequest::KnownHeaders 、rawHeader() 和setHeader()。
[since 6.8] QHttpHeaders QNetworkProxy::headers() const
返回在此网络请求中设置的请求头。
如果代理类型不是HttpProxy 或HttpCachingProxy ,则返回默认构造的QHttpHeaders 。
该函数在 Qt 6.8 中引入。
另请参阅 setHeaders()。
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
如果该代理支持 TCP 连接的透明隧道传输,则返回 `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 的原始形式。如果不存在该标头,或者代理类型不是HttpProxy 或HttpCachingProxy ,则返回一个空的QByteArray ,这可能与“标头存在但内容为空”的情况无法区分(请使用hasRawHeader()来判断标头是否存在)。
可以通过setRawHeader() 或setHeader() 设置原始标头。
另请参阅 header() 和setRawHeader()。
QList<QByteArray> QNetworkProxy::rawHeaderList() const
返回在此网络代理中设置的所有原始标头的列表。该列表按标头设置的顺序排列。
如果代理类型不是HttpProxy 或HttpCachingProxy ,则返回一个空的QList 。
另请参阅 hasRawHeader() 和rawHeader()。
[static] void QNetworkProxy::setApplicationProxy(const QNetworkProxy &networkProxy)
将应用程序级别的网络代理设置为networkProxy 。
如果QAbstractSocket 或QTcpSocket 的类型为QNetworkProxy::DefaultProxy ,则使用通过此函数设置的QNetworkProxy 。若希望在确定使用哪个代理时拥有更大的灵活性,请使用QNetworkProxyFactory 类。
使用此函数设置默认代理值将覆盖通过QNetworkProxyFactory::setApplicationProxyFactory 设置的应用程序代理生成器,并禁用系统代理的使用。
另请参阅 QNetworkProxyFactory 、applicationProxy()、QAbstractSocket::setProxy() 和QTcpServer::setProxy()。
void QNetworkProxy::setCapabilities(QNetworkProxy::Capabilities capabilities)
将此代理的权限设置为capabilities 。
另请参阅 setType() 和capabilities()。
void QNetworkProxy::setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value)
将已知标头“header ”的值设置为“value ”,并覆盖之前设置的任何标头。此操作还会设置相应的原始 HTTP 标头。
如果代理类型不是HttpProxy 或HttpCachingProxy ,则此操作无效。
另请参阅 QNetworkRequest::KnownHeaders 、setRawHeader() 和header()。
[since 6.8] void QNetworkProxy::setHeaders(QHttpHeaders &&newHeaders)
将newHeaders 设置为本次网络请求的头部,并覆盖之前设置的任何头部。
如果某些标头与已知标头对应,则会解析其值,并设置相应的解析后格式。
如果代理类型不是HttpProxy 或HttpCachingProxy ,则此操作无效。
此函数在 Qt 6.8 中引入。
另请参阅 headers() 和QNetworkRequest::KnownHeaders 。
[since 6.8] void QNetworkProxy::setHeaders(const QHttpHeaders &newHeaders)
这是一个重载函数。
该函数在 Qt 6.8 中引入。
void QNetworkProxy::setHostName(const QString &hostName)
将代理主机的主机名设置为hostName 。
另请参阅 hostName()、setPort() 以及port()。
void QNetworkProxy::setPassword(const QString &password)
将代理身份验证的密码设置为password 。
另请参阅 user()、setUser() 和password()。
void QNetworkProxy::setPort(quint16 port)
将代理主机的端口设置为port 。
另请参阅 hostName()、setHostName() 以及port()。
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 标头的行为,应将两个值用逗号(",")分隔后拼接起来,并设置为一个原始标头。
如果代理类型不是HttpProxy 或HttpCachingProxy ,则此操作无效。
另请参阅 QNetworkRequest::KnownHeaders 、setHeader()、hasRawHeader() 以及rawHeader()。
void QNetworkProxy::setType(QNetworkProxy::ProxyType type)
将此实例的代理类型设置为type 。
请注意,如果已通过setCapabilities() 设置了任何权限,则更改代理的类型不会改变该QNetworkProxy 对象所持有的权限集。
另请参阅 type() 和setCapabilities()。
void QNetworkProxy::setUser(const QString &user)
将代理身份验证的用户名设置为user 。
另请参阅 user()、setPassword() 和password()。
[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
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.