К сожалению, вы не можете.
TL; DR
Функция sendto
возвращается, как только пакет был отправлен в стек IP. IP-стек ядра обработает его и попытается отправить пакет через интерфейс WiFi.
В этом и заключается проблема: задержка передачи по WiFi большая (по сравнению с проводным Ethernet) и нерегулярная. Вот пример того, какую задержку вы должны ожидать:
Этот логарифмический график показывает задержку пинга между моим сервером и маршрутизатором, а также между моим сервером и беспроводным клиентом. Поскольку ping
является двунаправленным, однонаправленная задержка, вероятно, составляет примерно половину от этого.
Проводная связь показывает время пинга около 300 мкс, в то время как беспроводная связь показывает в среднем 7 мс (в 23 раза больше задержки).
Теперь почти тот же график, на этот раз линейный, чтобы выделить неровности:
Время Wi-Fi варьируется от 6 до 45 мс.
Решения
Поскольку функция sendto
возвращается раньше, чем вы ожидаете, вы не можете точно определить, в какое время пакеты отправляются. Если вас действительно интересует время отправки пакета, вы, вероятно, можете оценить его, подождав ответа от клиента и сократив время вдвое.
Но, как вы уже поняли, все WiFi-клиенты получают пакет одновременно, так как это многоадресная рассылка.
Итак, настоящий вопрос здесь: чего вы пытаетесь достичь?
Например, если вы хотите, чтобы все ваши клиенты воспроизводили один и тот же аудиопоток одновременно, какое-то программное обеспечение PLL должно сработать.
Если вы хотите минимизировать задержку, вы все равно можете попытаться настроить ваши настройки WiFi, особенно те, которые касаются энергосбережения, на маршрутизаторе и на клиентах.
И если вы хотите добиться высокой производительности в режиме реального времени , вам, вероятно, стоит просто забыть о Wi-Fi.