Какое минимальное значение SO_RCVBUF? - PullRequest
5 голосов
/ 11 февраля 2011

Чтобы минимизировать задержку (меня не волнует потеря пакетов), я хочу наименьший возможный приемный буфер для UDP.Однако, когда я устанавливаю SO_RCVBUF ниже 1000 (с setsockopt), моя программа никогда не получает никаких пакетов.Отправляемые мной дейтаграммы содержат 28 байтов данных для общего размера пакета в сети 70 байтов, так почему я ничего не могу получить, если SO_RCVBUF <1000?И как я могу изменить это, чтобы позволить меньший размер буфера? </p>

Кроме того, возможно ли установить буфер с точки зрения количества пакетов, а не байтов?Или есть какой-нибудь способ, которым я могу вручную опустошить это?

Ответы [ 3 ]

4 голосов
/ 21 февраля 2011

Уменьшение размера буфера приема сокета не уменьшит задержку.

Вместо этого вам необходимо каждый раз удалять все доступные пакеты.Это может быть выполнено с помощью неблокирующего сокета и запускается по фронту epoll или kqueue - при чтении «читаемого» события, пока вы не получите EWOULDBLOCK.

Относительно того, почему вы не получаете никакого ввода с небольшим значением SO_RCVBUF, посмотрите здесь - http://vger.kernel.org/~davem/skb_sk.html, и здесь - http://lxr.linux.no/#linux+v2.6.37/include/net/sock.h#L621

Надеюсь, это поможет.

0 голосов
/ 13 февраля 2011

Ваш вопрос не имеет смысла. Уменьшение размера буфера не уменьшает задержки. Это просто увеличивает вероятность того, что входящие дейтаграммы будут отброшены, что происходит, если в буфере приема сокета нет места. Ваш ответ о двух одновременных входящих пакетах также не имеет смысла. Задержка зависит от скорости обработки входящих данных, а не от размера буфера.

0 голосов
/ 11 февраля 2011

Скорее всего, это зависит от платформы, так на какую платформу вы нацеливаетесь?

Если вы используете Windows, тогда я предлагаю вам использовать перекрывающиеся порты ввода-вывода и I / O Completion Ports, установите recvбуфер до 0 и всегда имеет несколько ожидающих RecvFrom() вызовов.

Это должно a) удалить способность стека буферизовать дейтаграммы, когда у вас нет ожидания RecvFrom() и b) позволить вам обрабатывать некоторые дейтаграммы.

Затем вы настраиваете количество неоплаченных операций, которые у вас есть, так что у вас всегда будет немного больше, чем у вас ядер для обработки входящих дейтаграмм, и вы получите то, что хотите.

...