问题:同步UDP套接字中是否需要waitForReadyRead / waitForBytesWritten?

时间:2015-07-01 17:08:45

标签: 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调用它根本不起作用。

1 个答案:

答案 0 :(得分:1)

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

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

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

  3. 使用本机网络API。