QNetworkAccessManager 错误代码 99;仅在某些系统上....

QNetworkAccessManager Error Code 99; Only on Some Systems…

本文关键字:系统 错误代码 QNetworkAccessManager      更新时间:2023-10-16

使用 QNetworkAccessManager 时,我收到一个奇怪的错误,该错误只发生在某些系统上,而不会出现在其他系统上。

代码见下文。下面的测试连接到基于 SSL 的站点。

我在客户端系统上有OpenSSL DLL(libeay32.dll和ssleay32.dll),与我的应用程序位于同一目录中,但仍然发生错误。

错误代码为 (99) – 未知网络错误。

是什么导致某些系统上出现此错误,而在其他系统上则不然?

我该怎么做才能解决?

谢谢你的时间。

在应用程序的构造函数中: MainNetConnector = new QNetworkAccessManager(this);

启动测试的函数:

void QTBasicWidget::performNetworkTest() {
    QMessageBox::StandardButton RequestNetworkTest;
    RequestNetworkTest = QMessageBox::information(this, "Would you like to initiate a network test?",
        "Would you like to perform a network test?nnThe application will test the network for connectivity to and from the licensing server specified.nnResults will be displayed in the 'Log' tab.",
        QMessageBox::Yes | QMessageBox::No);
    QNetworkRequest req;
    QByteArray postData;
    QNetworkReply* reply;
    switch (RequestNetworkTest) {
    case QMessageBox::Yes:
        LoggingWidget->logText(tr("Beginning the network test."));
        if (UseSecuredURL) {
            req.setUrl(QUrl(SecureURL + "testconnection.php"));
            LoggingWidget->logText(tr("Connecting to secure URL: ") + SecureURL + tr("testconnection.php"));
        }
        else {
            req.setUrl(QUrl(UnsecureURL + "testconnection.php"));
            LoggingWidget->logText(tr("Connecting to unsecure URL: ") + UnsecureURL + tr("testconnection.php"));
        }
        MainNetConnector->setCookieJar(new QNetworkCookieJar(MainNetConnector));
        LoggingWidget->logText(tr("Cookie jar prepared for data to send."));
        reply = MainNetConnector->post(req, postData);
        LoggingWidget->logText(tr("Data sent."));
        connect(reply, &QNetworkReply::finished, this, &QTBasicWidget::processTestResults);
        connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
            this, SLOT(networkError(QNetworkReply::NetworkError)));
        if (TestingTimer) {
            TestingTimer->stop();
            TestingTimer->deleteLater();
            TestingTimer = NULL;
        }
        TestingTimer = new QTimer(this);
        connect(TestingTimer, SIGNAL(timeout()), this, SLOT(onDelayedNetworkTestReponse()));
        TestingTimer->start(5000);
        break;
    case QMessageBox::No:
        QMessageBox::information(this, "Test cancelled.",
            "Network test cancelled.",
            QMessageBox::Ok);
        break;
    default:
        QMessageBox::information(this, "Test cancelled.",
            "Network test cancelled.",
            QMessageBox::Ok);
        break;
    }
}

接收测试结果的函数:

void QTBasicWidget::processTestResults() {
    if (TestingTimer) {
        TestingTimer->stop();
        TestingTimer->deleteLater();
        TestingTimer = NULL;
    }
    LoggingWidget->logText(tr("Reply received."));
    auto reply = qobject_cast< QNetworkReply *>(sender());
    QByteArray bytes = reply->readAll();
    QString str = QString::fromUtf8(bytes.data(), bytes.size());
    LoggingWidget->logText(tr("Raw data from reply: ") + str);
    GLint statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    LoggingWidget->logText(tr("Reply status code: ") + QString::number(statusCode));
    if (statusCode == 200) {
        QMessageBox::StandardButton NetworkTestResults;
        NetworkTestResults = QMessageBox::information(this, "Test succeeded!.",
            "Network test succeeded.",
            QMessageBox::Ok);
    }
    else {
        QMessageBox::StandardButton NetworkTestFailed;
        NetworkTestFailed = QMessageBox::critical(this, "Test failed!.",
            "Network test failed.",
            QMessageBox::Ok);
    }
}

和错误处理功能: void QTBasicWidget::networkError(QNetworkReply::NetworkError err) {

    if (CurrentlyDebugging) {
        LoggingWidget->logText(tr("Network error. Error code is: ") + QString::number(err));
    }
    QMessageBox::StandardButton CriticalMessageBox;
    CriticalMessageBox = QMessageBox::critical(this, tr("Licensing Server Error"),
        tr("Specific error code was (") + QString::number(err) + tr(")"), QMessageBox::Ok);
}

http://doc.qt.io/qt-5/qtnetwork-downloadmanager-example.html

http://doc.qt.io/qt-5/qtnetwork-download-example.html

看起来您可能也应该检查SSL错误。

希望这是一个一致的错误,您可以找到正在发生的事情。 我最好的猜测是它与SSL有关。 下载程序示例演示如何查看这些错误。

#ifndef QT_NO_SSL
    connect(reply, SIGNAL(sslErrors(QList<QSslError>)), SLOT(sslErrors(QList<QSslError>)));
#endif
// ...
void DownloadManager::sslErrors(const QList<QSslError> &sslErrors)
{
#ifndef QT_NO_SSL
    foreach (const QSslError &error, sslErrors)
        fprintf(stderr, "SSL error: %sn", qPrintable(error.errorString()));
#else
    Q_UNUSED(sslErrors);
#endif
}

希望有帮助。

使用 "C:\Qt\MaintenanceTool.exe"添加或删除组件在Qt中>开发人员和设计器工具> OpenSSL x.y.z Toolkit

从以下目录复制所有 DLL,在 EXE 文件的目录中。C:\Qt\Tools\OpenSSL\Win_x64\bin