У меня есть приложение, которое отправляет сообщения по UDP в каком-то известном формате. Я хотел бы знать скорость, с которой эти сообщения отправляются. Чтобы быть ясным, мне наплевать на данные - это петля, так что это где-то около бесконечности + 1 - что мне нужно знать, как часто выходят полные сообщения .

2 ответа2

3

Вы должны посмотреть на использование TCPDUMP и WireShark для сбора данных, а затем проанализировать их.

Если все, что вас волнует, это скорость передачи пакетов, тогда запуск netstat может дать вам представление.

В Linux:

`netstat --interfaces=lo -c`

даст вам представление с интервалом в 1 секунду, но на большинстве современных ОС есть похожие флаги

0

Если под "сообщением" вы подразумеваете "дейтаграмму", то ответ равен 100%. UDP-датаграммы либо отправляются, либо нет, и они либо приходят, либо нет. Вы никогда не должны recvfrom() только часть дейтаграммы UDP. Если дейтаграмма оказывается больше, чем MTU сети, она может быть фрагментирована на уровне IP, но любые отброшенные фрагменты приведут к удалению всей дейтаграммы, а не частичного сообщения.

Скорость зацикливания не бесконечна: она ограничена процессором. Если вы отправляете данные слишком быстро, исходящий UDP-буфер заполнится. Затем, когда вы попытаетесь sendto() дейтаграмму, которая слишком велика, чтобы поместиться в оставшееся буферное пространство, вы получите ошибку, такую как EAGAIN , ENOBUFS или EMSGSIZE , в зависимости от реализации. Если получатель медленно вызывает recvfrom() , то его входящий буфер заполнится, и датаграммы будут молча отброшены.

Более актуальным вопросом является процент фактически отправленных дейтаграмм. При скоростях значительно ниже насыщения ЦП это должно быть 100% при обратной петле. Но при приближении к насыщению процессора или если приемник медленно читает дейтаграммы, он может стать сколь угодно низким.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .