Russian Qt Forum

Qt => Работа с сетью => Тема начата: Примерный ученик от Ноябрь 20, 2020, 09:30



Название: Прекращение поступления данных в UDP порт (решено)
Отправлено: Примерный ученик от Ноябрь 20, 2020, 09:30
QT5.11, Debian, GDB

Клиент слушает UDP порт, принимает данные и обрабатывает. Какое то время может час, а может и несколько дней, все нормально, а потом прием прерывается. В режиме отладчика событие readyRead() не возникает, по крайней мере точка останова не срабатывает.

QByteArray  m_InternalBuffer;   // буфер чтения

Код:
void udpClient::on_readyRead()
{
    m_InternalBuffer.clear();
    while (udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        qint64 l=udpSocket->pendingDatagramSize();
        datagram.resize(l);
        udpSocket->readDatagram(datagram.data(),l);
        m_InternalBuffer.append(datagram);
    }
    if (m_InternalBuffer.size()>0)
    {
        inByte+=m_InternalBuffer.size(); // принято всего

        QString rez=get(m_InternalBuffer);// обработка принятой информации

        // выдача на отображение родителю
        if (rc) QCoreApplication::sendEvent(rc,new Message_send_data(rez,numbKanal,inByte));
        qApp->processEvents();
    }
}


Перезапуск источника UDP не помогает.
Перезапуск приемника UDP - опять нормальная работа какое то время.

Где искать причину и как? Как в отладчике можно найти точку, где сейчас выполняется код запущенного под отладчиком приложения?


Название: Re: Прекращение поступления данных в UDP порт
Отправлено: qate от Ноябрь 20, 2020, 21:23
может был баг в qt ?
ну и на минимальном примере проверяй, чтобы убрать возможные баги в своем коде


Название: Re: Прекращение поступления данных в UDP порт (решено)
Отправлено: Примерный ученик от Март 25, 2021, 07:53
Разобрался. Ошибка в том, что сначала в слоте происходило чтение всего, что пришло, а потом проходила обработка и выход.
Дело в том, что если работает слот, то новая информация добавляется в буфер, но сигнал не испускается. Если выйти из слота, оставив
необработанные данные, то сигнала больше не будет. Буфер не пуст, новые данные добавляются, сигнала нет.
Код:
void udpClient::on_readyRead()
{
    while (udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        qint64 l=udpSocket->pendingDatagramSize();
        datagram.resize(l);
        udpSocket->readDatagram(datagram.data(),l);
        inByte+=l;
        // обработка принятой информации
        get_data(datagram);
    }
}

На всякий случай еще и поставил таймер для принудительной отправки сигнала наличия информации.
Зависаний больше нет.