QUdpSocket не получает данные на Windows, но работает на Ubuntu? - PullRequest
1 голос
/ 30 мая 2020

У меня есть приложение в QT 5.14, которое отлично работает на Linux (Ubuntu), однако, когда я пытаюсь построить его на windows, QUdpSocket получает данные.

#ifndef MYUDPSOCKET_H
#define MYUDPSOCKET_H

#include <QThread>
#include <QMutex>
#include <QUdpSocket>
#include "third_party/readerwriterqueue/atomicops.h"
#include "third_party/readerwriterqueue/readerwriterqueue.h"

/**
 * @brief The MyUDPSocket class
 */
class MyUDPSocket: public QThread
{
    Q_OBJECT

public:

    /**
     * @brief MyUDPSocket : constructor
     * @param buffer : queue to keep incoming buffers stored
     */
    MyUDPSocket(moodycamel::BlockingReaderWriterQueue<QByteArray>& buffer);

    /**
     * @brief ~MyUDPSocket : destructor
     */
    ~MyUDPSocket();

    /*==========[Public Function Declarations]====================================*/
    void run();

public slots:
    /*==========[Public Slot Declarations]====================================*/
    /**
     * @brief readPackets
     * @return void
     */
    void readPackets();

private:
    QUdpSocket *udpSkt; /**< udp socket */
    moodycamel::BlockingReaderWriterQueue<QByteArray>& queue; /**< blocking queue */

};

#endif // MYUDPSOCKET_H

И вот исходный файл:

#include <QUdpSocket>
#include "myudpsocket.h"

MyUDPSocket::MyUDPSocket(moodycamel::BlockingReaderWriterQueue<QByteArray>& buffer)
    : queue(buffer)
{
    moveToThread(this);
    qDebug() << "Thread:" << currentThread() << "Setting up MyUDPSocket...";
}

MyUDPSocket::~MyUDPSocket()
{
    exit();
    wait();
    delete udpSkt;
    qDebug() << "MyUDPSocket Destroyed!";
}

void MyUDPSocket::run()
{
    udpSkt = new QUdpSocket(this);
    udpSkt->bind(QHostAddress::AnyIPv4, 56666);
    connect(udpSkt, SIGNAL(readyRead()), this, SLOT(readPackets()));
    // Setup event loop to receive packets
    exec();
}

void MyUDPSocket::readPackets()
{
    while (udpSkt->hasPendingDatagrams())
    {
        QByteArray datagram;
        datagram.resize(udpSkt->pendingDatagramSize());
        QHostAddress sender;
        quint16 senderPort;

        udpSkt->readDatagram(datagram.data(), datagram.size(),
                             &sender, &senderPort);

        if(datagram.size() > 0) {
            queue.enqueue(datagram);
        }
    }
}

Цель кода проста: получить дейтаграмму и поставить ее в очередь для обработки другим потоком.

Проверено на Windows 10, но даже с localhost не работает. Я пробовал использовать PacketSender или Microsoft UDP Sender / Receiver, но безуспешно.

Может ли кто-нибудь объяснить, почему это не работает на Windows 10, но отлично работает на Linux?

Спасибо!

...