Отбрасывание входящий пакет UDP без чтения

В некоторых случаях я хотел бы явно отбросить пакеты, ожидающие на сокете с как можно меньше служебным. Кажется, что нет никакого явного "отбрасывания udp буферного" системного вызова, но возможно я неправ?

Следующий лучший способ был бы, вероятно, к recv пакет к временному буферу и просто отбрасывает его. Кажется, что я не могу получить 0 байтов, так как человек говорит о recv: The return value will be 0 when the peer has performed an orderly shutdown. Так 1 минимум в этом случае.

Там какой-либо другой путь состоит в том, чтобы обработать это?

На всякий случай - это не преждевременная оптимизация. Единственная вещь, которую делает этот сервер, передает / диспетчеризация пакетов UDP в особенном методе - хотя recv с len=1 не уничтожит меня, я просто отбросил бы целую очередь сразу с некоторой более определенной функцией (надо надеяться, понижение задержки).

5
задан viraptor 21 June 2010 в 15:31
поделиться

3 ответа

Вы можете заставить ядро ​​отбрасывать ваши UDP-пакеты, установив для буфера приема UDP значение 0.

int UdpBufSize = 0;
socklen_t optlen = sizeof(UdpBufSize);
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &UdpBufSize, optlen);

Когда вы сочтете нужным получать пакеты, вы можете затем установить буфер на, например 4096 байт.

8
ответ дан 18 December 2019 в 16:36
поделиться

Я бы предпочел просто отбросить всю очередь за один раз

Поскольку это UDP, мы говорим здесь: close (udp_server_socket) и socket () / bind () снова?

Насколько я понимаю, должно работать.

3
ответ дан 18 December 2019 в 16:36
поделиться

Человек говорит о recv: возвращаемое значение будет 0, когда партнер выполнил упорядоченное завершение работы.

Это не относится к UDP. Нет никакого "соединения" для выключения в UDP. Возвращаемое значение 0 является совершенно допустимым, это просто означает, что была получена дейтаграмма без полезной нагрузки (т.е. только заголовки IP и UDP).

Не уверен, что помогает решить вашу проблему или нет. Я действительно не понимаю, куда вы идете с материалом len = 1.

1
ответ дан 18 December 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: