一、问题描述及解决方案:
客户端使用QT的network模块通过https协议获取服务端数据时在个别电脑上报错:“QNetworkReply::UnknownNetworkError”。经排查发现,该问题同"libcrypto-1_1-x64.dll"、"libssl-1_1-x64.dll"两个openssl库文件相关,使用VS2013重新编译openssl-1.1.1v后,对这两个库文件进行了替换,问题得到了解决。
二、相关代码:
QString common_interface::httpPost(QString jsonContent, QString qUrlS)
{
QString req_data;
QByteArray queryErrorResult;
queryErrorResult.clear();
//设置超时处理定时器
QTimer timer;
timer.setInterval(3000); //设置超时时间 3 秒
timer.setSingleShot(true); //单次触发
QUrl qUrl(qUrlS);
QByteArray postData; //上传的json内容
postData.append(QJsonDocument(QStringToJson(jsonContent)).toJson());
//设置发送
QNetworkAccessManager* manager = new QNetworkAccessManager();
QNetworkRequest request;
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setUrl(qUrl);
//开启一个局部的事件循环,等待响应结束,退出
QNetworkReply* reply = manager->post(request, postData);
QEventLoop eventLoop;
connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
timer.start(); //启动定时器
eventLoop.exec(); //启动事件循环
if(timer.isActive())
{
//处理响应,定时器激活状态
timer.stop(); //停止定时器
if(reply->error() != QNetworkReply::NoError)
{
//http请求出错,进行错误处理
reply->deleteLater();
req_data = QByteArrayToQString(queryErrorResult);
RecordLog(QString("reply error:%1!!!").arg(reply->error()));
return req_data;
}
else
{
//http响应状态码
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if(statusCode == 200)
{
//http请求响应正常
//write_filecontent("./DebugData.txt",reply->readAll());
QByteArray replyContent = reply->readAll();
req_data = QByteArrayToQString(replyContent);
RecordLog("http请求响应正常");
return req_data;
}
else
{
reply->deleteLater();
req_data = QByteArrayToQString(queryErrorResult);
RecordLog(QString("reply error:%1!!!").arg(statusCode));
return req_data;
}
}
}
else
{
//超时处理
disconnect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
reply->abort();
req_data = QByteArrayToQString(queryErrorResult);
RecordLog("http请求响应超时!!!");
return req_data;
}
}
三、抛砖引玉
至今尚不清楚个别电脑上为什么会出现这个问题,替换openssl的库文件后为什么问题可以得到解决。希望大家可以指点迷津,静候高人指点。