关于QT实现HTTPS通信(MSVC编译器),并解决QSslSocket::connectToHostEncrypted: TLS initialization failed的报错

根据客户需求,写了一个小的通讯软件,用于与上游服务器通讯。采用的是Https协议。


通用写法及问题描述

通讯软件在自己电脑上可运行,但是在客户电脑上就无法正常运行。总是显示连接不上,日志打印后,会出现“QSslSocket::connectToHostEncrypted: TLS initialization failed”的报错。代码通用部分写法精简如下:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
	QNetworkAccessManager* pManager = new QNetworkAccessManager(this);
	QNetworkRequest request;
	QUrl url = ui->lineIPServer->text();
	request.setUrl(QUrl(url));
	request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json; charset=utf-8");
	QString jsonToSever = "xxxxxx";
	QString strSendToSercer = QString("{\"dataList\": %1}").arg(jsonToSever);
	QByteArray bytePost = strSendToSercer.toUtf8();
	QNetworkReply *pReply = pManager->post(request, bytePost);
	connect(pReply, &QNetworkReply::finished, this, &MainWindow::onFinished);
}

void MainWindow::onFinished()
{
    qDebug() << "server return";
    QNetworkReply *pReply = qobject_cast<QNetworkReply*>(sender());

    // <1>判断有没有错误
    if (pReply->error()){
        //输出错误码及错误信息
        qDebug()<< pReply->errorString();
        ui->txtSended->append(QStringLiteral("服务器无返回数据,正尝试重新上传。。。"));
        pReply->deleteLater();
        pReply = nullptr;
        return;
    }

    // <2>检测状态码
    int statusCode  = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    qDebug() << "statusCode:" << statusCode;

    // <3>状态码正常,服务器成功响应本次请求
    if (statusCode >= 200 && statusCode <300){
        //读取返回的数据并刷新显示
        QByteArray replyContent = pReply->readAll();
        QTextCodec *codec = QTextCodec::codecForName("utf8");
        QString all = codec->toUnicode(replyContent);
        qDebug() << all;
        ui->txtSended->append(all);
        // 数据读取完成之后,清除reply
        pReply->deleteLater();
        pReply = nullptr;
    }
}

原因分析:

之前biying搜了一下,大多数是在打包后的程序里放入D:\QT\Tools\mingw810_64\opt\bin目录下的两个动态库ssleay32.dll和libeay32.dll,解决了问题。但是我试了却怎么也行不通。本人使用的QT版本为5.15.2。

解决方案:

后来在QT的Tools目录下发现了OpenSSL文件夹。
在这里插入图片描述
点进去将其中的libcrypto-1_1-x64.dll和libssl-1_1-x64.dll,放在exe根目录下运行,就可以正常接收服务器返回数据。搞定!
在这里插入图片描述

个人猜想,可能是因为本人采用的编译器是msvc2019。再加上QT版本较新,原先的ssleay32.dll和libeay32.dll已经不再适用了。

QT的HTTPS写法参考链接链接: https://zhuanlan.zhihu.com/p/349171758

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 当使用MSVC编译器QT中进行编译时,可能会遇到各种报错。其中一种常见的报错是"Project ERROR: Cannot run compiler 'cl'",这是因为在QT的安装目录下没有找到cl.exe文件。解决方法是下载Windows SDK,并将vcvarsall.bat文件的路径添加到QT编译器中。具体的步骤是,在QT的设置中选择MSVC编译器,然后添加vcvarsall.bat文件的路径,并选择是x86还是x64版本。然后返回到kits选项,选择刚刚配置过的编译器。\[1\] 另外,当使用MSVC编译器编译Qwidget项目时,可能会遇到各种报错,如Link1158 RC.exe无法运行、NNAME无法找到、MSVCRTD.dll找不到等等。这些问题可能是由于编译器配置不正确导致的。解决方法是检查编译器的配置是否正确,并确保已勾选JOM选项。如果问题仍然存在,可能需要进一步分析具体的错误信息以找到解决方法。\[3\] 总之,当使用MSVC编译器QT中进行编译时,需要确保正确配置编译器,并根据具体的报错信息进行逐一排查和解决。 #### 引用[.reference_title] - *1* *2* [QT使用MSVC编译器报错:Project ERROR: Cannot run compiler ‘cl‘以及后续问题解决](https://blog.csdn.net/wang_mu_mu_/article/details/126983472)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [关于QT使用MSVC编译各种奇怪报错的情况总结](https://blog.csdn.net/weixin_47187658/article/details/125531357)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值