LINUX.ORG.RU

SO_SNDLOWAT and Nonblocking

 


0

1

SO_SNDLOWAT is an option to set the minimum count for output operations. Most output operations process all of the data supplied by the call, delivering data to the protocol for transmission and blocking as neces- sary for flow control. Nonblocking output operations will process as much data as permitted subject to flow control without blocking, but will process no data if flow control does not allow the smaller of the low water mark value or the entire request to be processed. A select(2) operation testing the ability to write to a socket will return true only if the low water mark amount could be processed. The default value for SO_SNDLOWAT is set to a convenient size for network efficiency, often 1024.

http://www.freebsd.org/cgi/man.cgi?query=setsockopt&apropos=0&sektion...

Правильно ли я понимаю, что send на неблокируемом сокете вернет мне EAGAIN, если в буфере отправки сокета осталось свободного места меньше чем SO_SNDLOWAT?

Вряд ли стоит рассчитывать на такое поведение. Скорее стоит понимать эту опцию только как гарантию того, что данные указанного размера можно записать без блокировки, если select() сообщает о возможности записи.

Sorcerer ★★★★★ ()
Ответ на: комментарий от Sorcerer

В линуксовых манах вообще другое вкладывается в эту опцию.

http://linux.die.net/man/7/socket

SO_RCVLOWAT and SO_SNDLOWAT Specify the minimum number of bytes in the buffer until the socket layer will pass the data to the protocol (SO_SNDLOWAT) or the user on receiving (SO_RCVLOWAT). These two values are initialized to 1. SO_SNDLOWAT is not changeable on Linux (setsockopt(2) fails with the error ENOPROTOOPT). SO_RCVLOWAT is changeable only since Linux 2.4. The select(2) and poll(2) system calls currently do not respect the SO_RCVLOWAT setting on Linux, and mark a socket readable when even a single byte of data is available. A subsequent read from the socket will block until SO_RCVLOWAT bytes are available.

placement_new ★★ ()
Ответ на: комментарий от placement_new

При этом freebsd на бумажке понимает эту опцию правильно, т.к. процитированный Вами абзац из мана скопирован из posix.

Но в linux всё равно неявно присутствует такой же watermark, т.к. отправляемый буфер не непрерывный, а состоит из кусочков определённого размера, поэтому пока целый кусочек не будет свободен, select() не сообщит о возможности записи.

Sorcerer ★★★★★ ()
Ответ на: комментарий от Sorcerer

Проверил на freebsd - таки работает :) send успешно принимает только либо все переданные байты, либо только забирает сколько есть места в буфере на отправку, если там свободно больше чем SO_SNDLOWAT.

placement_new ★★ ()
Последнее исправление: placement_new (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.