【问题标题】:Using QUdpSocket as QIODevice使用 QUdpSocket 作为 QIODevice
【发布时间】:2017-01-02 19:06:35
【问题描述】:

我想使用一些标准的QUdpSocket 方法,确切地说是read() 和readAll()。所以,根据QUdpSocket的文档:

如果要使用标准的QIODevice函数read()、readLine()、write()等,必须首先通过调用connectToHost()将套接字直接连接到对等体。

我在bind()之后直接调用connectToHost():

socket.bind(QHostAddress::LocalHost, 14560);
socket.connectToHost(QHostAddress::LocalHost, 14560);

现在它可以读取,但不会发出readyRead() 信号。 QUdpSocket的QIODevice函数的正确使用方法是什么?

DeviceReader.h:

class DeviceReader : public QObject {
        Q_OBJECT
    public:
        DeviceReader() {}

        void setDevice(QIODevice * device) {
            _device = device;
            connect(device, &QIODevice::readyRead, this, &DeviceReader::onDataReceived);
        }

        void onDataReceived() {
            qDebug() << "received: " << _device->readAll();
        }
    private:
        QIODevice * _device;
};

main.cpp:

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    DeviceReader reader;
    QUdpSocket socket;

    socket.bind(QHostAddress::LocalHost, 14560);
    socket.connectToHost(QHostAddress::LocalHost, 14560);    
    reader.setDevice(&socket);

    return a.exec();
}

Qt 版本是 5.7.0 clang x64。操作系统:macOS Sierra 10.12.2。

【问题讨论】:

    标签: c++ qt networking network-programming


    【解决方案1】:

    在我看来,同时使用 bind 和 connectToHost 是不正确的。

    bind 方法必须用于 UDP 服务器和 connectToHost 方法必须用于仅 UDP 客户端。因此,只需尝试省略 connectToHost 调用,您将在 14560 端口收到传入数据报。

    Qt 文档中的绑定方法描述:

    对于 UDP 套接字,绑定后,只要 UDP 数据报到达指定的地址和端口,就会发出信号 QUdpSocket::readyRead()。因此,此函数对于编写 UDP 服务器很有用。

    【讨论】:

    • 是的,它有效,但在这种情况下,我必须使用readDatagram() 和writeDatagram(),而不是read() 和write() 方法。我想使用相同的方法onDataReceived() 从任何QIODevie(QTcpSocket、QSerialPort 等)接收。
    • 那么,是否可以同时使用read()、write() 方法和readyRead() 信号?
    • Камиль, похоже что QIODevice интерфейс можно использовать только для udp-клиента :-( Какой-то 史诗失败 у qt'шников。
    • Андрей, ясно, спасибо за ответ.
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多