UDP является вполне жизнеспособным протоколом. Это тот же самый старый случай правильного инструмента для правильной работы!
Если у вас есть программа, которая ожидает дейтаграммы UDP, а затем отключается, чтобы обработать их, прежде чем вернуться к ожиданию другой, то истекшее время обработки должно всегда быть быстрее, чем скорость поступления дейтаграмм в худшем случае. Если это не так, очередь приема сокета UDP начнет заполняться.
Это может быть допустимо для коротких очередей. Очередь делает именно то, что должна делать - ставит дейтаграммы в очередь, пока вы не будете готовы. Но если средняя скорость поступления регулярно вызывает отставание в очереди, пришло время изменить дизайн вашей программы. Здесь есть два основных варианта: сократить время обработки с помощью хитроумных методов программирования и / или многопоточности вашей программы. Также может использоваться балансировка нагрузки для нескольких экземпляров вашей программы.
Как уже упоминалось, в Linux вы можете проверить файловую систему proc, чтобы узнать, что такое UDP. Например, если я cat
узел /proc/net/udp
, я получаю что-то вроде этого:
$ cat /proc/net/udp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops
40: 00000000:0202 00000000:0000 07 00000000:00000000 00:00000000 00000000 0 0 3466 2 ffff88013abc8340 0
67: 00000000:231D 00000000:0000 07 00000000:0001E4C8 00:00000000 00000000 1006 0 16940862 2 ffff88013abc9040 2237
122: 00000000:30D4 00000000:0000 07 00000000:00000000 00:00000000 00000000 1006 0 912865 2 ffff88013abc8d00 0
Исходя из этого, я вижу, что сокет, принадлежащий идентификатору пользователя 1006, прослушивает порт 0x231D (8989) и что очередь на получение составляет около 128 КБ. Поскольку максимальный размер моей системы составляет 128 КБ, это говорит о том, что моя программа крайне слаба в соответствии с поступающими датаграммами. Пока было отброшено 2237, то есть уровень UDP не может помещать больше дейтаграмм в очередь сокетов и должен их отбрасывать.
Вы можете наблюдать за поведением вашей программы с течением времени, например, с помощью:
watch -d 'cat /proc/net/udp|grep 00000000:231D'
Обратите внимание, что команда netstat делает то же самое: netstat -c --udp -an
Мое решение для моей программы weenie будет многопоточным.
Ура!