Qt:在同步UDP套接字中是否需要waitForReadyRead/waitForBytesWritten

Qt: Is waitForReadyRead/waitForBytesWritten necessary in a synchronous UDP socket?

本文关键字:waitForReadyRead waitForBytesWritten 是否 同步 UDP 套接字 Qt      更新时间:2023-10-16

QUDPSocket可以在同步模式下在没有事件循环的情况下使用。我发现了下面的例子:

#include <QUdpSocket>
#include <QTextStream>
int main()
{
    QTextStream qout(stdout);
    QUdpSocket *udpSocket = new QUdpSocket(0);
    udpSocket->bind(3838, QUdpSocket::ShareAddress);
    while (udpSocket->waitForReadyRead(-1)) {
        while(udpSocket->hasPendingDatagrams()) {
            QByteArray datagram;
            datagram.resize(udpSocket->pendingDatagramSize());
            QHostAddress sender;
            quint16 senderPort;
            udpSocket->readDatagram(datagram.data(), datagram.size(),
                                    &sender, &senderPort);
            qout << "datagram received from " << sender.toString() << endl;
        }
    }
}

我的问题是:waitForReadyRead在这里有必要吗?如果我不担心CPU消耗,我可以用while(1)代替吗?如果我需要写作,是否需要添加waitForBytesWritten?

我曾经在Qt下以同步模式处理TCP套接字,如果没有waitForReadyRead调用,它根本无法工作。

是。套接字在内部使用非中断平台notifications,并且这些notifications只有在事件循环waitFor...方法控制线程时才会触发。您的选择是:

  1. 使用C++11 lambdas/闭包编写异步代码,以保持代码简洁,而不需要显式的辅助对象。或者编写带有显式QObjects的Qt 4风格异步代码,这些代码提供处理程序槽。

  2. 使用waitFor...方法编写伪同步代码,但需要注意的是,在同一线程上运行的QObject的某些方法可能需要是可重入的。

  3. 使用本机网络API。

相关文章:
  • 没有找到相关文章