У меня есть приложение в 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?
Спасибо!