011. QNetworkProxy類的作用

QNetworkProxy為Qt網絡類提供代理支持,使得網絡應用能方便地配置和使用代理,例如Socks5代理。應用可靈活設置代理或禁用其個別套接字。這一類使得Qt網絡類,如QAbstractSocket、QTcpSocket等,能夠輕鬆配置和使用代理。代理設計得儘可能透明,使得現有的網絡應用程序只需簡單改動即可支持網絡代理。例如,只需幾行代碼,你的應用程序就能自動使用Socks5代理連接到指定的主機和端口,並使用用户名和密碼進行身份驗證。此外,還可以為個別套接字或服務器設置代理,或選擇禁用代理。

Roson的Qt之旅 #128 QNetworkProxy(網絡層代理)_UDP

代理功能的實現
bool GlobalProxy::setSocks5Proxy(const QString &host, quint16 port,
                                const QString &user, const QString &password)
{
    emit logMessage(QString::fromLocal8Bit("正在設置SOCKS5代理..."));

    // 創建SOCKS5代理對象
    m_proxy.setType(QNetworkProxy::Socks5Proxy);
    m_proxy.setHostName(host);
    m_proxy.setPort(port);

    if (!user.isEmpty()) {
        m_proxy.setUser(user);
        m_proxy.setPassword(password);
    }

    // 設置應用程序級代理(影響所有Qt網絡連接)
    QNetworkProxy::setApplicationProxy(m_proxy);

    // 禁用系統代理檢測,使用我們設置的代理
    QNetworkProxyFactory::setUseSystemConfiguration(false);

    m_isEnabled = true;

    // 保存設置
    saveSettings(host, port, user, password);

    //QString proxyStr = QString("%1:%2").arg(host).arg(port);
   // setupSystemProxy(true, proxyStr);

    emit logMessage(QString::fromLocal8Bit("SOCKS5代理設置成功: %1:%2").arg(host).arg(port));
    return true;
}

void GlobalProxy::clearProxy()
{
    if (!m_isEnabled) return;

    emit logMessage(QString::fromLocal8Bit("正在清除代理設置..."));

    // 設置無代理
    QNetworkProxy noProxy(QNetworkProxy::NoProxy);
    QNetworkProxy::setApplicationProxy(noProxy);

    // 恢復系統代理設置
   // QNetworkProxyFactory::setUseSystemConfiguration(true);

    // 清除系統代理設置
    //setupSystemProxy(false);

    m_isEnabled = false;
    emit logMessage(QString::fromLocal8Bit("代理設置已清除"));
}

1. 哪些連接會走代理

  • ✅ HTTP/HTTPS請求 - QNetworkAccessManager 的所有請求
  • ✅ TCP連接 - 所有QTcpSocket連接
  • ✅ UDP連接 - SOCKS5代理支持UDP轉發
  • ✅ WebSocket - QWebSocket 連接
  • ✅ FTP - QFtp 連接(如果使用)
  • ✅ 其他Qt網絡類 - 所有基於QAbstractSocket的派生類