Не всегда срабатывает readyread()

Рейтинг: 0Ответов: 0Опубликовано: 15.06.2023

Отправляю с одного компьютера на другой большой файл:

QFile file(filename)
if(file.isOpen(QIODevice::ReadOnly))
{
    quint64 bytesAvialable = file.bytesAvialable();
    while(bytesAvialable > 1024)
    {
        char buf[1024];
        file.read(buf, 1024);
        QByteArray dataBuff, dataOut;
        databuff.append(buf, sizeof(buf));
       
        QDataStream stream(&dataOut, QIODevice::WriteOnly);
        stream.setByteOrder(QDataStream::BigEndian);
        stream.writeRawData(dataBuff.data(), dataBuff.size());
        emit signalReadyData(dataOut);
        bytesAvialable -= dataBuff.size();
    }
    file.close();
}

Но на стороне приёмника получаю меньшее число пакетов, нежели было отправлено. Например, если отправить 6000000 пакетов, на стороне приёмника будет 5500000 пакетов. При этом, пакеты не попадают в очередь, так как на стороне приёмника в слоте:

slotReadyRead()
{
    qDebug() << socket->bytesAvialable();
    while(socket->hasPendingDatagrams());
    {
        QByteArray datagram;
        datagram.resize(socket->pendingDatagramSize());
        socket->readDatagram(datagram.data(), datagram.size());
        emit signalReadyData(datagram);
    }
}

socket->bytesAvialable() показывает число, равное размеру одного пакета. Пробовал увеличить очередь с помощью sysctl -w net.core.rmem_default = 26214400 и sysctl -w net.core.rmem_max = 26214400, но не помогло. При этом, если уменьшать скорость выдачи пакетов(например, с помощью thread.usleep(1), то количество отправленных и полученных пакетов совпадает. Вопрос в следующем: из-за чего readyRead() может не испускаться при приёме пакета и как можно увеличить скорость обработки получаемых пакетов, так как мне кажется, что readyRead() не успевает срабатывать из-за этого.

Ответы

Ответов пока нет.