我可以在 Qt 中使用 QUdpSockets wo 轮询或自定义类吗? [英] Can I use QUdpSockets wo polling or custom classes in Qt?

查看:21
本文介绍了我可以在 Qt 中使用 QUdpSockets wo 轮询或自定义类吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面是 Qt 中的一个简短的 UDP 服务器示例,它确实有效,但我不喜欢的是我正在轮询以查看新数据是否可用.我遇到了一些 readyRead() 的例子,但它们似乎都引入了一个 qt 类.我是否需要使用 qt 类才能利用 readyRead() 信号?

Here is a short UDP server example in Qt below which does work but what I don't like is that I'm polling to see if new data is available. I've come across some examples of a readyRead() but they all seem to introduce a qt class. Do I need to use a qt class in order to take advantage of the readyRead() signal?

这是完全在 main 中实现的工作但简单的 UDP 服务器:

Here is the working but simple UDP server implemented entirely in main:

#include <QDebug>
#include <QUdpSocket>
#include <QThread>

int main(int argc, char *argv[])
{
    QUdpSocket *socket = new QUdpSocket();
    u_int16_t port = 7777;

    bool bindSuccess =  socket->bind(QHostAddress::AnyIPv4, port);
    if (!bindSuccess) {
        qDebug() << "Error binding to port " << port << " on local IPs";
        return a.exec();
    }
    qDebug() << "Started UDP Server on " << port << endl;

    QHostAddress sender;
    while (true) {
        while (socket->hasPendingDatagrams()) {
            QByteArray datagram;
            datagram.resize(socket->pendingDatagramSize());
            socket->readDatagram(datagram.data(),datagram.size(),&sender,&port);
            qDebug() << "Message From :: " << sender.toString();
            qDebug() << "Port From :: "<< port;
            qDebug() << "Message :: " << datagram.data();
        }
        QThread::msleep(20);
    }

    return 0;
}

这是一个 readyRead() 信号的例子:https://www.bogotobogo.com/Qt/Qt5_QUdpSocket.php

Here is an example of the readyRead() signal: https://www.bogotobogo.com/Qt/Qt5_QUdpSocket.php

我还没有真正想出如何让它发挥作用.我一定做错了什么.这是我正在尝试的 UDP 连接代码:

I haven't really figured out how to get this to work yet. I must be doing something wrong. Here is the UDP connection code i'm trying:

#include "myudp.h"

MyUDP::MyUDP(QObject *parent) : QObject(parent) {
}

void MyUDP::initSocket(u_int16_t p) {
    port = p;

    udpSocket = new QUdpSocket(this);
    bool bindSuccess = udpSocket->bind(QHostAddress::LocalHost, port);
    if (!bindSuccess) {
        qDebug() << "Error binding to port " << port << " on local IPs";
        return;
    }
    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
}

void MyUDP::readPendingDatagrams() {
    QHostAddress sender;
    while (udpSocket->hasPendingDatagrams()) {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());
        udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &port);
        qDebug() << "Message From :: " << sender.toString();
        qDebug() << "Port From :: " << port;
        qDebug() << "Message :: " << datagram.data();
    }
}

myudp.h

#include <QObject>
#include <QUdpSocket>

class MyUDP : public QObject
{
    Q_OBJECT
public:
    explicit MyUDP(QObject *parent);
    void initSocket(u_int16_t p);

    u_int16_t port;
    QUdpSocket *udpSocket;

signals:

public slots:
    void readPendingDatagrams();
};

新建 main.cpp

new main.cpp

int main(int argc, char *argv[]) 
{
    MyUDP *myUDP = new MyUDP(0);
    myUDP->initSocket(port);

    while (true) {
        usleep(1000);
    }

    return 0;
}

我正在测试:

netcat 127.0.0.1 -u 7777
{"cid"="0x1234123412341", "fill_level"=3245 }<cr>

推荐答案

你做错的是你没有让 Qt 的事件循环运行.即这是不正确的:

What you're doing wrong is that you're not letting Qt's event loop run. i.e. this is incorrect:

int main(int argc, char *argv[]) 
{
   MyUDP *myUDP = new MyUDP(0);
   myUDP->initSocket(port);

   while (true) {
       usleep(1000);
   }

   return 0;
}

...相反,你应该有这样的东西:

... instead, you should have something like this:

int main(int argc, char *argv[]) 
{
   QApplication app(argc, argv);

   // connect needs to occur after QCoreApplication declaration
   MyUDP *myUDP = new MyUDP(0);
   myUDP->initSocket(port);

   return app.exec();
}

...它在 app.exec() 调用中,Qt 应用程序在此调用大部分时间(app.exec() 直到Qt 想退出),而 Qt 将在这里处理您的 UDP 套接字的 I/O 和信号需求.

... it is inside the app.exec() call where a Qt application spends most of its time (app.exec() won't return until Qt wants to quit), and there is where Qt will handle your UDP socket's I/O and signaling needs.

这篇关于我可以在 Qt 中使用 QUdpSockets wo 轮询或自定义类吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆