c++ - Qt:同步 UDP 套接字中是否需要 waitForReadyRead/waitForBytesWritten?

标签 c++ qt sockets

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 调用,它根本无法工作。

最佳答案

是的。套接字在内部使用非中断平台通知,这些通知仅在事件循环 waitFor... 方法控制线程时触发。您的选择是:

  1. 使用 C++11 lambdas/闭包编写异步代码以保持代码简洁,无需显式帮助对象。或者使用提供处理程序插槽的显式 QObject 编写 Qt 4 风格的异步代码。

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

  3. 使用原生网络 API。

关于c++ - Qt:同步 UDP 套接字中是否需要 waitForReadyRead/waitForBytesWritten?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31167605/

相关文章:

c - setsockopt 的目的到底是什么?

c++ - CMake:防止在子目录库项目中构建测试可执行目标

c++ - 在 C++ 中自定义排序字符串

c++ - 无缝滚动瓦片 map

c++ - Qt list.clear() 会破坏对象的吗?

c - malloc 内存损坏,fopen

c++ - "extern PACKAGE TMyForm * MyForm"是什么意思

c++ - 从 Qt 应用程序中删除标题栏

c++ - 获取 QMap::iterator 的位置 (int)

linux - 使用 bash 查看 tcp 端口是否已绑定(bind)(未监听)