修复libtcp传输过程中因网络异常出现的内存访问越界问题

master
bob.pan 4 years ago
parent db8ca51fe6
commit 7ddfd1b048

@ -12,6 +12,8 @@ tcpClientRecv::tcpClientRecv(const QString uuid, QObject *parent /*= 0*/)
connect(socket_ptr_, SIGNAL(bytesWritten(qint64)), this, SLOT(on_bytes_written(qint64)), Qt::DirectConnection);
connect(socket_ptr_, SIGNAL(disconnected()), this, SLOT(on_disconnected()), Qt::DirectConnection);
connect(socket_ptr_, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(on_socket_error(QAbstractSocket::SocketError)), Qt::DirectConnection);
connect(this, SIGNAL(sgStartSession(const QString, const QString&, qint16)), this, SLOT(on_session_start(const QString, const QString&, qint16)));
}
tcpClientRecv::~tcpClientRecv()
@ -55,8 +57,6 @@ void tcpClientRecv::set_msg_body(const QJsonObject& msg_body)
void tcpClientRecv::on_session_start(const QString uuid, const QString& ip_addr, qint16 port)
{
if (uuid_ == uuid)
{
if (!connect_timeout_timer_)
{
connect_timeout_timer_ = new QTimer();
@ -71,7 +71,7 @@ void tcpClientRecv::on_session_start(const QString uuid, const QString& ip_addr,
trans_timeout_timer_->setInterval(2000);
connect(trans_timeout_timer_, SIGNAL(timeout()), this, SLOT(on_transfer_timeout()));
}
{
if (uuid_ == uuid) {
if (connect_timeout_timer_)
{
connect_timeout_timer_->stop();
@ -79,7 +79,6 @@ void tcpClientRecv::on_session_start(const QString uuid, const QString& ip_addr,
}
begin(ip_addr, port);
}
}
}
void tcpClientRecv::on_connected()
@ -112,10 +111,14 @@ void tcpClientRecv::on_ready_read()
if (current_recv_size_ >= should_recv_size_)
return;
char* dataPtr = pDataRecv_ + current_recv_size_;
if ((current_recv_size_ + size) > should_recv_size_)
{
size = should_recv_size_ - current_recv_size_;
}
if (dataPtr != nullptr)
{
memcpy(dataPtr, pDataRecvBuf, size);
current_recv_size_ += size;
memcpy(dataPtr, pDataRecvBuf, size);
}
}
if (trans_timeout_timer_)
@ -214,3 +217,8 @@ Q_SLOT void tcpClientRecv::on_transfer_timeout()
close();
}
/*
*/

@ -23,6 +23,7 @@ public:
signals:
void signal_data_recv_completed(QString uuid, QSharedPointer<QByteArray>, QSharedPointer<QJsonObject>);
void sgException(QString uuid);//Òì³£ »ò¶Ï¿ªÁ¬½ÓµÈ²Ù×÷
void sgStartSession(const QString uuid, const QString& ip_addr, qint16 port);
public slots:
virtual void on_session_start(const QString uuid, const QString& ip_addr, qint16 port);
virtual void on_connected();

@ -48,6 +48,7 @@ void tcpServerSend::set_msg_body(const QJsonObject& msgbody)
void tcpServerSend::set_bin_data_to_send(const QByteArray& data)
{/*初始化要发送数据的相关参数*/
std::lock_guard<std::mutex> guard(m);
bin_data_to_send_ = data;
bin_data_size_to_send_ = data.size();
bin_data_ptr_ = bin_data_to_send_.data();
@ -223,6 +224,7 @@ void tcpServerSend::session_established()
void tcpServerSend::socket_send()
{
std::lock_guard<std::mutex> guard(m);
int min_package_size = std::min((int)bin_data_size_to_send_ - (int)sent_size_, SOCKET_BUFFER_SIZE);
if (min_package_size > 0)
{

@ -9,7 +9,7 @@
#include <QJsonObject>
#include <QTimer>
#include "../include/libTcp.h"
#include <mutex>
#ifndef _SOCKET_SIZE_
#define SOCKET_BUFFER_SIZE 4096
#endif
@ -70,6 +70,8 @@ private:
QTimer *listen_timeout_timer_{ nullptr };
quint16 curPort_{ 0 };
mutable std::mutex m;
};
#endif

@ -115,9 +115,9 @@ void TPTcpClient::createChildRevSocket(int socketNum)
data_sess_ptr->moveToThread(thread_ptr);
connect(thread_ptr, &QThread::finished, data_sess_ptr, &QObject::deleteLater);
connect(data_sess_ptr, &tcpClientRecv::signal_data_recv_completed, this, &TPTcpClient::on_data_recv_completed/*, Qt::QueuedConnection*/);
connect(this, &TPTcpClient::signal_session_start, data_sess_ptr, &tcpClientRecv::on_session_start/*, Qt::QueuedConnection*/);
connect(data_sess_ptr, &tcpClientRecv::sgException, this, &TPTcpClient::on_data_recv_close/*, Qt::QueuedConnection*/);
connect(data_sess_ptr, &tcpClientRecv::signal_data_recv_completed, this, &TPTcpClient::on_data_recv_completed, Qt::QueuedConnection);
connect(this, &TPTcpClient::signal_session_start, data_sess_ptr, &tcpClientRecv::on_session_start, Qt::QueuedConnection);
connect(data_sess_ptr, &tcpClientRecv::sgException, this, &TPTcpClient::on_data_recv_close, Qt::QueuedConnection);
data_sessions_[strUuid] = thread_ptr;
m_childRevSocket_Map[strUuid] = QPair<bool, tcpClientRecv*>(false, data_sess_ptr);
thread_ptr->start();
@ -330,7 +330,8 @@ void TPTcpClient::on_msg_received()
QString strUuid = pClient->getUuid();
//qDebug() << "curUUId:" << strUuid<<" port:"<<nport;
pClient->set_msg_body(msg_ptr->body);
emit signal_session_start(strUuid, host_ip_, nport);
emit pClient->sgStartSession(strUuid, host_ip_, nport);
//emit signal_session_start(strUuid, host_ip_, nport);
setRevSocketisBusy(strUuid, true);
}
}

@ -380,11 +380,15 @@ void TPTcpServer::on_disconnected(int sessID)
}
}
{
std::lock_guard<std::mutex> guard(m);
for (QMap<int, ClientDataSendPair>::iterator it = m_ClientSendPairMap.begin(); it != m_ClientSendPairMap.end(); ++it)
{
(*it).first = false;
}
}
}
}
void TPTcpServer::refuse_data_request(const QString& strClient, const QString& strReason)
{

@ -22,9 +22,9 @@
#include "databasesql.h"
#include "lpCryptokey.h"
#define VERSION_HUB "3.0.3.3"
#define VERSION_HUB "3.0.4.0"
#define VERSION_ALG "3.0.1.4"
#define UPDATE_TIME "2021-12-10"
#define UPDATE_TIME "2021-12-15"
#pragma execution_character_set("utf-8")
#define MODEL_UI_ICON_NONE ":/image/no-img"

@ -29,7 +29,7 @@ valueMainUI::valueMainUI(QWidget *parent)
setupTrayIcon();//后台任务栏初始化
setWindowIcon(QIcon(WINDOWICON));
setWindowTitle(tr("识别定位一体检测系统(v1.1.0 21.12.13)"));
setWindowTitle(tr("识别定位一体检测系统(v1.3.0 21.12.15)"));
lpGlobalData::instance();
lpConfig::instance()->loadConfig();
@ -572,7 +572,8 @@ void valueMainUI::timerEvent(QTimerEvent *event)
ui.textEdit->append(tr("连接超时,尝试重新连接检测软件"));
}
if (lpConfig::instance()->doubleStation == true)
{
if (m_CoutB > 15)
{
m_bServerB = false;
@ -582,7 +583,7 @@ void valueMainUI::timerEvent(QTimerEvent *event)
ui.textEdit_2->clear();
ui.textEdit_2->append(tr("连接超时,尝试重新连接检测软件"));
}
}
{
if (m_bServerA == true)
{

@ -88,9 +88,10 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<PreprocessorDefinitions>UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WEBSOCKETS_LIB;QT_WIDGETS_LIB;QT_LOCATION_LIB;QT_NETWORK_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWebSockets;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtLocation;$(QTDIR)\include\QtNetwork;.\..\..\src\tpMain\algela;.\..\..\3part\tadpole\include\tpBase;.\..\..\src\tpMain;.\..\..\tpvs17\tpMain\lpRawTcp;.\..\..\src\libtcp\common;.\..\..\src\libtcp\include;.\..\..\src\libtcp\libClient;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<DebugInformationFormat />
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
<Optimization>Disabled</Optimization>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>

Loading…
Cancel
Save