首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QUdpSocket readyRead()没有发送?

QUdpSocket readyRead()没有发送?
EN

Stack Overflow用户
提问于 2021-08-10 12:33:05
回答 1查看 176关注 0票数 0

我对Qt和调试一个使用QtUdpSocket接收一些数据的应用程序都很陌生。似乎从未发出readyRead()信号:

代码语言:javascript
复制
#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;
};

代码语言:javascript
复制
#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(),但是没有任何数据报。

我遗漏的代码中有错误吗?或者,您可以提示如何调试此问题吗?

如果有必要,我很乐意提供更多的信息或代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-11 11:38:38

我单独测试了所有建议的更改,它们似乎都是必要的。MyUDP::bindPorts()的工作版本现在看起来如下:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68726886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档