李太白3028
2025-07-30 ba557576d960281d774ac1e3c83f2e29786ed682
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#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);
    }
}