Вступить в клуб →
сложнаявопросСети в Linux: сокеты, epoll и Boost.Asio

UDP-приёмник телеметрии теряет хвосты пакетов без ошибок

Сенсоры шлют по UDP пакеты размером до 1400 байт. Приёмник:

char buf[1024];
ssize_t n = recvfrom(fd, buf, sizeof buf, 0, (sockaddr*)&from, &len);
parsePacket(buf, n);

Часть пакетов разбирается с ошибкой «оборванные данные», recvfrom при этом возвращает ровно 1024 и не сигнализирует ошибку. Остаток пакета в следующем вызове не приходит. Почему?

  • Не влезшая в буфер часть датаграммы отбрасывается
  • Остаток придёт следующим recvfrom, как в TCP
  • Ядро фрагментирует пакеты больше 1024 байт
  • Отправители обрезают пакеты по размеру MTU

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела