У меня относительно простая настройка сервера для многих клиентов.Сервер отправляет дейтаграммы с использованием многоадресной рассылки, и их получают (потенциально многие) клиенты.
Клиенты Linux (RHEL) получают / считывают поток этих дейтаграмм со скоростью примерно 3-4 Мбит / с, используя:
QByteArray datagram;
while (udpSocketReceiver->hasPendingDatagrams())
{
datagram.resize(udpSocketReceiver->pendingDatagramSize());
udpSocketReceiver->readDatagram(datagram.data(), datagram.size());
}
Кажется, это работает, вероятно, 99,99% времени.Тем не менее, я иногда вижу, что датаграмма пропускается (как это видно по используемым мной внутренним счетчикам / схемам).Моей первой мыслью было: «Ну, это UDP - он просто должен быть сброшен при передаче».
Однако я также отслеживаю сторону клиента / получателя с помощью tcpdump ... и я также видит присутствующие там «отсутствующие» дейтаграммы, которые пропущены приложением.Казалось бы, пропущенные дейтаграммы очень хорошо принимаются сетевым интерфейсом, но я иногда отбрасываю их, приходя на уровень приложений.Примерно в последнем месте, где я бы хотел их отбросить.
Я играл с настройкой соответствующих буферов в Linux (net.core.rmem_max, net.core.rmem_default), но безуспешно.
Спасибо за любую помощь.