我对Qt和调试一个使用QtUdpSocket接收一些数据的应用程序都很陌生。似乎从未发出readyRead()信号:
#include <QUdpSocket>
#include<qdatastream.h>
#include "Globals.h"
typedef struct _udp_data_frame
{
quint8 signal;
quint8 rampNumber;
QByteArray recvBuffer;
quint32 payloadPacketSize;
}UDPDataFrame_t;
class MyUDP : public QUdpSocket
{
Q_OBJECT
public:
explicit MyUDP(QObject *parent = nullptr);
bool bindPorts(QHostAddress addr, qint16 port);
void unbindPorts(void);
void stopStreaming(void);
signals:
void newMessage(const QString &from, const QString &message);
void newData(const QString &from, UDPDataFrame_t data);
public slots:
void readyRead(void);
void messageReady(void);
void sendMessage(QHostAddress hostAddress, quint16 hostPort, QString string);
private:
QUdpSocket *socket_infoserver;
QUdpSocket *socket_streamingclient;
UDPDataFrame_t data;
QByteArray buffer;
QHostAddress clientAddr;
quint16 clientPort;
quint32 payloadPacketSize;
quint8 header;
};和
#include "myudp.h"
#include <iostream>
static inline quint32 ArrayToUInt(QByteArray source, QDataStream::ByteOrder byteOrder);
static inline quint8 ArrayToByte(QByteArray source);
static bool bStreamingStarted;
MyUDP::MyUDP(QObject *parent) : QUdpSocket(parent)
{
socket_infoserver = new QUdpSocket();
socket_streamingclient = new QUdpSocket();
}
bool MyUDP::bindPorts(QHostAddress addr, qint16 port)
{
socket_infoserver->abort();
socket_streamingclient->abort();
QHostAddress remote_host;
remote_host.setAddress("192.168.168.130");
if (socket_streamingclient->bind(addr, ROPA_STREAMPORT))
{
socket_streamingclient->connectToHost(remote_host, ROPA_STREAMPORT);
socket_streamingclient->waitForConnected(1000);
connect(socket_streamingclient, SIGNAL(readyRead()), this, SLOT(messageReady()));
}
return true;
}
void MyUDP::readyRead()
{
QByteArray temp_buffer;
temp_buffer.resize(socket_infoserver->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
socket_infoserver->readDatagram(temp_buffer.data(), temp_buffer.size(),
&sender, &senderPort);
emit newMessage(sender.toString(), temp_buffer);
}
void MyUDP::messageReady()
{
...
}到目前为止,我已经确认有使用Wireshark的传入数据包。目标IP和端口是正确的。此外,我可以使用nc -l -u -p <PORT>在命令行中看到传入的数据。此外,我还尝试在绑定之后添加一个socket_streamingclient->hasPendingDatagrams(),但是没有任何数据报。
我遗漏的代码中有错误吗?或者,您可以提示如何调试此问题吗?
如果有必要,我很乐意提供更多的信息或代码。
发布于 2021-08-11 11:38:38
我单独测试了所有建议的更改,它们似乎都是必要的。MyUDP::bindPorts()的工作版本现在看起来如下:
bool MyUDP::bindPorts(QHostAddress addr, qint16 port)
{
socket_streamingclient->abort();
if(socket_streamingclient->bind( QHostAddress::Any, ROPA_STREAMPORT,
QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint) )
{
connect(socket_streamingclient, &QUdpSocket::readyRead, this, &MyUDP::messageReady);
}
return true;
}https://stackoverflow.com/questions/68726886
复制相似问题