我在 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 上工作得很好的见解?
谢谢!