Префикс «SO_» предназначен для «опции сокета», так что да, это настройки для каждого сокета для буферов для каждого сокета. Обычно существуют общесистемные значения по умолчанию и максимальные значения.
SO_RCVBUF
проще для понимания: это размер буфера, который ядро выделяет для хранения данных, поступающих в данный сокет в течение времени между тем, когда они поступают по сети и когда они читаются программой, которая владеет этим разъем. В случае TCP, если данные поступают, а вы их не читаете, буфер заполнится, и отправителю будет приказано замедлить работу (используя механизм настройки окна TCP). Для UDP, когда буфер заполнен, новые пакеты просто отбрасываются.
SO_SNDBUF
, я думаю, имеет значение только для TCP (в UDP все, что вы отправляете, отправляется напрямую в сеть). Для TCP вы можете заполнить буфер либо, если удаленная сторона не читает (так что удаленный буфер переполняется, тогда TCP сообщает об этом факте вашему ядру, и ваше ядро прекращает отправку данных, вместо этого накапливая их в локальном буфере до тех пор, пока заполняет). Или он может заполниться, если возникнет проблема с сетью, и ядро не получит подтверждения для отправляемых данных. Затем он будет замедлять отправку данных по сети, пока, в конце концов, исходящий буфер не заполнится. Если это так, будущие write()
вызовы этого сокета приложением будут блокироваться (или возвращать EAGAIN
, если вы установили опцию O_NONBLOCK
).
Все это лучше всего описано в Сетевом программировании Unix .