首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QUdpSocket失去有效性

QUdpSocket失去有效性
EN

Stack Overflow用户
提问于 2018-03-08 16:27:55
回答 1查看 183关注 0票数 0

我有一个关于QUdpSocket的问题:我每隔0.2秒就会在端口50011上接收到发往组播地址239.0.0.1的UDP消息(经过wireshark验证)。

下面的代码工作正常(并在每条消息上显示“有效”)大约1分钟。在那之后,messageHandler不再被QUdpSocket's信号readyRead调用(尽管我已经与wireshark进行了两次检查,消息仍在发送中)。

代码语言:javascript
复制
ServiceDiscovery::ServiceDiscovery(QObject *parent) :
    QObject(parent),
    socket(new QUdpSocket(this))
{
    socket->bind(QHostAddress::AnyIPv4, 50011, QUdpSocket::ShareAddress);
    socket->joinMulticastGroup(QHostAddress("239.0.0.1"));
    connect(socket, &QUdpSocket::readyRead, 
            this, &ServiceDiscovery::messageHandler, 
            Qt::DirectConnection);
}

void ServiceDiscovery::messageHandler()
{
    if(socket->isOpen()) qDebug("OPEN"); // Does not print, ofc.
    if(socket->isReadable()) qDebug("READABLE"); // Does not print.
    if(socket->isValid()) qDebug("VALID"); // Suddenly stops.

    QByteArray datagram;
    while(socket->hasPendingDatagrams()) {
        datagram.resize(socket->pendingDatagramSize());
        socket->readDatagram(datagram.data(), datagram.size());
        Message response(datagram);
        if(response.deserialize()) {
            if(response.getServiceID() == constants::servicediscovery::SERVICE_ID) {
                QByteArray payload = response.getPayload();
                if(payload.size() >= 48) {
                    QString address = QHostAddress(payload.mid(32, 4).toHex().toUInt(nullptr, 16)).toString();
                    quint16 port = payload.mid(38, 2).toHex().toUInt(nullptr, 16);
                    emit found(address, port);
                }
            }
        }
    }
}

我在这里做错了什么?提前谢谢。

编辑:由于注释,我也粘贴了数据报处理。

EN

回答 1

Stack Overflow用户

发布于 2021-03-04 06:09:18

记录:我也有同样的问题。原因:我的应用程序依赖的一个演示库在评估时间过后关闭,不仅是它的开放端口,而且是应用程序的所有端口。

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

https://stackoverflow.com/questions/49168579

复制
相关文章

相似问题

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