#include "uploador.h"
|
//#include "struct_data.h"
|
UpLoador::UpLoador(QObject *parent) : QObject(parent)
|
{
|
m_client = new QTcpSocket(this);
|
m_client->connectToHost("192.168.1.2", 8888);
|
|
if(m_client->waitForConnected()){
|
qDebug() << "ok";
|
|
// 创建心跳工作线程
|
m_heartbeatThread = new QThread(this);
|
m_heartbeatWorker = new HeartbeatWorker(m_client);
|
m_heartbeatWorker->moveToThread(m_heartbeatThread);
|
|
connect(m_heartbeatThread, &QThread::started, m_heartbeatWorker, &HeartbeatWorker::start);
|
connect(m_heartbeatThread, &QThread::finished, m_heartbeatWorker, &HeartbeatWorker::deleteLater);
|
|
m_heartbeatThread->start();
|
|
// 原有信号槽连接
|
connect(this, SIGNAL(unpackSignal(QByteArray)), this, SLOT(unpackSlot(QByteArray)));
|
connect(m_client, SIGNAL(readyRead()), this, SLOT(myRead()));
|
connect(m_heartbeatWorker, &HeartbeatWorker::requestHeartbeat,
|
this, [this](){
|
if(m_client) {
|
HeartCheckReq req;
|
qDebug()<<"heart checking...";
|
m_client->write((char*)&req, sizeof(req));
|
}
|
}, Qt::QueuedConnection);
|
} else {
|
qDebug() << "conn err";
|
}
|
}
|
|
UpLoador::~UpLoador()
|
{
|
|
if(m_heartbeatThread) {
|
m_heartbeatThread->quit();
|
m_heartbeatThread->wait(1000);
|
delete m_heartbeatThread;
|
}
|
}
|
|
int UpLoador::upfile(std::shared_ptr<char> buf, int rlen)
|
{
|
if (!buf || rlen <= 0) { // 检查智能指针是否为空
|
return -1;
|
}
|
if (m_client) {
|
// 关键修改:用 buf.get() 获取原始指针
|
int len = m_client->write(reinterpret_cast<char*>(buf.get()), rlen);
|
qDebug() << "Sent bytes:" << len;
|
return len;
|
}
|
return -1; // 补充返回值
|
}
|
|
void UpLoador::myRead()
|
{
|
if(!m_client || m_client->state() != QAbstractSocket::ConnectedState) {
|
qDebug() << "Cannot read - not connected";
|
return;
|
}
|
|
while(m_client->bytesAvailable() > 0) {
|
QByteArray buffer = m_client->readAll();
|
if(buffer.isEmpty()) {
|
qDebug() << "Read empty data";
|
continue;
|
}
|
|
qDebug() << "Received data:" << buffer.toHex();
|
|
// 处理粘包问题
|
m_buffer.append(buffer);
|
processBuffer();
|
}
|
}
|
|
|
|
void UpLoador::unpackSlot(QByteArray buffer)
|
{
|
|
}
|
void UpLoador::processBuffer() {
|
while(m_buffer.size() >= sizeof(Head)) {
|
const Head* head = reinterpret_cast<const Head*>(m_buffer.constData());
|
|
// 添加长度校验
|
if(head->len <= 0 || head->len > 10 * 1024 * 1024) { // 假设最大10MB
|
m_buffer.clear();
|
qWarning() << "Invalid packet length";
|
return;
|
}
|
|
if(m_buffer.size() < head->len) break;
|
|
QByteArray completePacket = m_buffer.left(head->len);
|
m_buffer.remove(0, head->len);
|
emit unpackSignal(completePacket);
|
}
|
}
|