Не всегда срабатывает readyread()
Отправляю с одного компьютера на другой большой файл:
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()
не успевает срабатывать из-за этого.