#include "NetDataRecv.h" #include NetDataRecv::NetDataRecv(QObject* parent) : QThread(parent) , m_bNeedWork(false) , m_pProcess(nullptr) , m_pFrame(nullptr) , m_socketId(nullptr) { m_network.ip = ""; m_network.port = 0; m_network.type = 0; } NetDataRecv::~NetDataRecv() { m_file.write(m_fileArray); m_file.flush(); m_file.close(); } void NetDataRecv::init(Frame* frame, Network network, IProcess* process) { m_pFrame = frame; m_network = network; m_pProcess = process; createDataPath("Network"); initNetwork(); } void NetDataRecv::createDataPath(QString title) { QString strFilePath = m_pFrame->m_dataStore.m_strDataPath + "/" + title + "_" + m_pFrame->m_dataStore.m_strStoreType + "_" + m_pFrame->m_dataStore.m_strDateTime + ".bin"; m_file.setFileName(strFilePath); m_file.open(QIODevice::WriteOnly); } void NetDataRecv::initNetwork() { // 创建用于监听的套接字 m_socketId = new QUdpSocket(this); m_socketId->bind(QHostAddress::AnyIPv4, m_network.port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint); // 设置套接字缓冲区: 1M m_socketId->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, NET_BUFFER); // 组播 if (m_network.type == 2) { m_socketId->joinMulticastGroup(QHostAddress(m_network.ip)); m_socketId->setSocketOption(QAbstractSocket::MulticastLoopbackOption, true); } } void NetDataRecv::send() { QByteArray sendArray; m_socketId->writeDatagram(sendArray, QHostAddress(m_network.ip), m_network.port); } void NetDataRecv::run() { m_bNeedWork = true; while (m_bNeedWork) { // 接收数据 QNetworkDatagram datagram = m_socketId->receiveDatagram(NET_BUFFER); if (!datagram.isValid()) { QThread::usleep(1); continue; } auto recvdata = datagram.data(); // 将数据放到缓冲区 if (m_pProcess) { QMutexLocker locker(&m_mutex); m_pProcess->getConstBuffer()->write((unsigned char*)recvdata.data(), (unsigned short)recvdata.size()); m_fileArray.append((char*)recvdata.data(), recvdata.size()); if (DataAchiveBuffer <= m_fileArray.size()) { m_file.write(m_fileArray); m_file.flush(); m_fileArray.clear(); } } } } void NetDataRecv::stop() { m_bNeedWork = false; quit(); wait(); if (m_network.type == 2) { m_socketId->leaveMulticastGroup(QHostAddress(m_network.ip)); } delete m_socketId; m_socketId = nullptr; }