QUdpSocket 接收组播数据,并从线程里发送到MainWindow

很简单的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;
}


猜你喜欢

转载自blog.csdn.net/lyang0303/article/details/80251147