首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用QUdpSocket作为QIODevice

使用QUdpSocket作为QIODevice
EN

Stack Overflow用户
提问于 2017-01-02 19:06:35
回答 1查看 747关注 0票数 0

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

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

我直接在connectToHost()之后打电话给bind()

代码语言:javascript
复制
socket.bind(QHostAddress::LocalHost, 14560);
socket.connectToHost(QHostAddress::LocalHost, 14560);

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

DeviceReader.h:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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.0clang x64。操作系统: macOS塞拉利昂10.12.2。

EN

回答 1

Stack Overflow用户

发布于 2017-01-02 19:29:07

在我看来,将、bind、connectToHost一起使用是不正确的。

绑定方法必须用于UDP服务器,而connectToHost方法只能用于UDP客户端。因此,只需尝试省略connectToHost调用,您将在14560端口上接收到传入的数据报。

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

对于UDP套接字,绑定后,每当UDP数据报到达指定地址和端口时,发出信号QUdpSocket::readyRead()。因此,此函数对于编写UDP服务器非常有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41432095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档