使用QUdpSocket作为QIODevice

时间:2017-01-02 19:06:36

标签: c++ qt networking network-programming

我想使用一些标准的QUdpSocket方法来准确read()readAll()。因此,根据QUdpSocket的文档:

  

如果您要使用标准QIODevice函数read()readLine()write()等,则必须首先通过调用{将套接字直接连接到对等方{1}}。

我在connectToHost()之后直接致电connectToHost()

bind()

现在它可以读取,但它不会发出socket.bind(QHostAddress::LocalHost, 14560); socket.connectToHost(QHostAddress::LocalHost, 14560); 信号。使用readyRead()的{​​{1}}函数的正确方法是什么?

QIODevice

QUdpSocket

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;
};

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

1 个答案:

答案 0 :(得分:1)

从我的角度来看,将 bind connectToHost 结合使用是不正确的。

在UDP服务器的情况下必须使用

绑定 方法,并且 connectToHost 方法必须用于仅限UDP客户端。因此,只需尝试省略 connectToHost 调用,您将在14560端口上接收传入的数据报。

在Qt docs中绑定方法描述:

  

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