Отменить входящий пакет UDP без чтения - PullRequest
5 голосов
/ 21 июня 2010

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

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

Есть ли другой способ справиться с этим?

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

Ответы [ 3 ]

8 голосов
/ 23 июня 2010

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

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

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

3 голосов
/ 21 июня 2010

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

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

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

1 голос
/ 21 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...