SOCK_SEQPACKET буферизирует ~ 42k данных, как ограничить его до меньшего?

Пример клиента (http://pastebin.com/hAbpFPia) и сервера (http://pastebin.com/9pL27hkK) с использованием SOCK_SEQPACKET указывает, что клиент может поставить в очередь ~ 42 тыс. Данных.

Использование setsockopt (socket, SOL_SOCKET, SO_SNDBUF,...) для установки размера на размер клиента существенно ограничивает буферизованные данные. Есть ли способ, который я могу обеспечить/установить этот лимит со стороны сервера? Я попытался установить SO_RCVBUF на socket accept() ed и сокет перед вызовом accept(), но ни один из них не работает для меня.

Использование AF_UNIX.

1 ответ

Сервер не может обеспечить размер SO_SNDBUF на клиенте.

SO_SNDBUF ограничивает буфер, используемый операционной системой-отправителем. Отправляющее приложение может отправлять до SO_SNDBUF байты, даже если базовая сеть не может отправить данные прямо сейчас, пока не будет блокирована отправка. ОС позаботится о передаче этих данных, когда сетевой стек сможет принять новую отправку.

SO_RCVBUF, если буфер, который использует ОС приемника. Сетевой стек получает (и подтверждает отправитель) до байтов SO_RCVBUF, даже если приложение не вызывает recv для извлечения данных. Для сокетов домена unix SO_RCVBUF не имеет никакого эффекта, но SO_SNDBUF имеет.

Как вы можете видеть, оба буфера суммируются. И они работают на разных концах сетевого подключения. Они не влияют друг на друга, и получатель не может принудительно выполнить SO_SNDBUF со стороны отправителя - поскольку отправитель не может принудительно выполнить SO_RCVBUF на стороне получателя.

licensed under cc by-sa 3.0 with attribution.