В некоторых случаях я хотел бы явно отбросить пакеты, ожидающие на сокете с как можно меньше служебным. Кажется, что нет никакого явного "отбрасывания udp буферного" системного вызова, но возможно я неправ?
Следующий лучший способ был бы, вероятно, к recv
пакет к временному буферу и просто отбрасывает его. Кажется, что я не могу получить 0 байтов, так как человек говорит о recv
: The return value will be 0 when the peer has performed an orderly shutdown.
Так 1 минимум в этом случае.
Там какой-либо другой путь состоит в том, чтобы обработать это?
На всякий случай - это не преждевременная оптимизация. Единственная вещь, которую делает этот сервер, передает / диспетчеризация пакетов UDP в особенном методе - хотя recv
с len=1
не уничтожит меня, я просто отбросил бы целую очередь сразу с некоторой более определенной функцией (надо надеяться, понижение задержки).
Вы можете заставить ядро отбрасывать ваши UDP-пакеты, установив для буфера приема UDP значение 0.
int UdpBufSize = 0;
socklen_t optlen = sizeof(UdpBufSize);
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &UdpBufSize, optlen);
Когда вы сочтете нужным получать пакеты, вы можете затем установить буфер на, например 4096 байт.
Я бы предпочел просто отбросить всю очередь за один раз
Поскольку это UDP, мы говорим здесь: close (udp_server_socket)
и socket () / bind () снова?
Насколько я понимаю, должно работать.
Человек говорит о recv: возвращаемое значение будет 0, когда партнер выполнил упорядоченное завершение работы.
Это не относится к UDP. Нет никакого "соединения" для выключения в UDP. Возвращаемое значение 0 является совершенно допустимым, это просто означает, что была получена дейтаграмма без полезной нагрузки (т.е. только заголовки IP и UDP).
Не уверен, что помогает решить вашу проблему или нет. Я действительно не понимаю, куда вы идете с материалом len = 1.