Будет ли send () когда-либо блокироваться при использовании select ()? - PullRequest
8 голосов
/ 16 января 2012

Когда сокет сигнализирует о том, что с помощью вызова на select() все в порядке, как я могу узнать, сколько данных я могу отправить без блокировки? (В случае полных буферов отправки и т. Д.)

Означает ли включение в набор, возвращаемый select(), что сокет готов как минимум для одного байта данных и будет send() затем возвращать небольшое количество записанных байтов?

Или блокируется, когда я вызываю send() с параметром len, который больше доступного пространства буфера? Если да, то как узнать максимальную сумму?

Я использую обычные сокеты C в Linux.

Ответы [ 2 ]

5 голосов
/ 16 января 2012

Вызов send не должен блокироваться при первом вызове и должен посылать как минимум один байт при первом вызове - при условии, что вы используете потоковый протокол, и при условии, что он не прерывается сигналом и т. Д. Однакона самом деле есть только два способа выяснить, сколько данных вы можете отправить:

  1. Звоните select после каждого звонка на send, чтобы увидеть, можно ли отправлять больше данных.

  2. Переведите сокет в неблокирующий режим и вызывайте send, пока он не выдаст ошибку EAGAIN или EWOULDBLOCK.

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

4 голосов
/ 16 января 2012

Вы не можете знать. Вы должны отправить сокет, чтобы он был неблокирующим, а затем обратите внимание на возвращаемое значение, которое сообщает вам, сколько он написал.

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