Определение размера следующей дейтаграммы UDP на платформах BSD?

В Linux я могу использовать вызов ioctl с FIONREAD, чтобы получить количество байтов для следующего пакета UDP.

Это не работает в OSX, и вместо этого я должен использовать вызов getsockopt с SO_NREAD, чтобы определить количество байтов для пакета.

Есть ли способ избежать просмотра или чтения в большой буфер с последующим копированием для достижения того же результата на платформах BSD?


person hookenz    schedule 26.03.2014    source источник


Ответы (1)


FIONREAD работает в BSD. Собственно, отсюда и пошло. Но он возвращает общее количество байтов, доступных для чтения без блокировки, что может быть более одной дейтаграммы.

EDIT Вы можете попробовать использовать MSG_PEEK|MSG_TRUNC и указать длину буфера, равную нулю или единице, если это не нравится. Он должен вернуть вам реальную длину.

person user207421    schedule 26.03.2014
comment
Насколько я понимаю, он возвращает количество байтов для всего выходного буфера (включая заголовки). Я пока не могу это протестировать, но в ближайшем будущем мы запустим это на freebsd. - person hookenz; 26.03.2014
comment
Я провел небольшое тестирование и решил жить с дополнительным memcpy. Получается, что разница в производительности незначительна. Но я оставлю этот вопрос на случай, если кто-то захочет узнать, работает ли FIONREAD так же, как Linux. - person hookenz; 26.03.2014
comment
Так вот что вы имеете в виду под не работает. Вы можете попробовать использовать MSG_PEEK|MSG_TRUNC и указать длину буфера, равную нулю или единице, если это не нравится. Он должен вернуть вам реальную длину. - person user207421; 26.03.2014
comment
Да, я думал, что для следующего пакета UDP было бы достаточно объяснений. Спасибо за подсказку относительно MSG_PEEK|MSG_TRUNC. Я не знал, что вы можете заглянуть с усечением. Добивается того же. - person hookenz; 26.03.2014