很简单的demo,实现接收组播端口的数据,最后从线程里发送出来(借鉴了一下CenterControl的代码)。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
#include <QThread>
#include <QUdpSocket>
#include <QTimer>
#include <QPointer>
class QLineEdit;
class UdpWorker : public QObject
{
Q_OBJECT
public:
UdpWorker(int flag);
~UdpWorker();
private:
QUdpSocket udpSocket;
QHostAddress destAddress;
qint16 destPort;
int _flag;
signals:
void readData(int,int);
private slots:
void readPendingDatagrams();
void setFlag(int);
};
class UdpThread : public QThread
{
public:
explicit UdpThread(QWidget *receiver = 0,int flag = 0);
~UdpThread();
protected:
void run();
private:
QPointer<QWidget> m_receiver;
int port;
int _mflag;
};
class MainWindow : public QWidget
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void recDataBytes(int value1,int value2);
private:
UdpThread *udpThread;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
UdpThread::UdpThread(QWidget *receiver,int flag) : m_receiver(receiver)
{
qDebug() << "UdpThread::UdpThread threadid=" << (unsigned int)QThread::currentThreadId();
_mflag = flag;
}
UdpThread::~UdpThread()
{
qDebug() << "~UdpThread";
}
void UdpThread::run()
{
qDebug() << "UdpThread::run threadid=" << (unsigned int)QThread::currentThreadId();
UdpWorker udpWorker(_mflag);
if (!m_receiver.isNull()){
connect(&udpWorker, SIGNAL(readData(int,int)), m_receiver.data(), SLOT(recDataBytes(int,int)),Qt::QueuedConnection);
}
exec();
}
UdpWorker::UdpWorker(int flag)
{
qDebug() << "UdpWorker::UdpWorker threadid=" << (unsigned int)QThread::currentThreadId();
_flag = flag;
QString ip = "226.0.0.80";
int port = 8000;
destAddress.setAddress(ip);
destPort = port;
bool ret = udpSocket.bind(QHostAddress::AnyIPv4,destPort, QUdpSocket::ShareAddress);
bool rnt = udpSocket.joinMulticastGroup(destAddress);
if(ret && rnt){
udpSocket.setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, 104857600);
connect(&udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
}
qDebug() << "reset port, then bind again, flag=" << "flag=" << flag;
}
UdpWorker::~UdpWorker()
{
}
void UdpWorker::readPendingDatagrams()
{
while (udpSocket.hasPendingDatagrams()){
QByteArray datagram;
datagram.resize(udpSocket.pendingDatagramSize());
udpSocket.readDatagram(datagram.data(), datagram.size());
char * dataTemp = datagram.data();
int value1 = 0;
int value2 = 0;
memcpy(&value1,&dataTemp[0],1);
memcpy(&value2,&dataTemp[1],1);
emit readData(value1,value2);
}
}
void UdpWorker::setFlag(int){
}
MainWindow::MainWindow(QWidget *parent) : QWidget(parent)
{
qDebug() << "MainWindow threadid=" << (unsigned int)QThread::currentThreadId();
udpThread = new UdpThread(this,1);
connect(udpThread, &UdpThread::finished, udpThread, &UdpThread::deleteLater);
udpThread->start();
}
void MainWindow::recDataBytes(int value1,int value2)
{
qDebug() << "=====recDataBytes=========="<<QString::number(value1)<<QString::number(value2);
}
MainWindow::~MainWindow()
{
qDebug() << "~MainWindow";
udpThread->exit(0);
delete udpThread;
}