возникли проблемы с пониманием использования write_fds в select () - c - PullRequest
1 голос
/ 20 мая 2011

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

select(max_fd+1,&read_fd,&write_fd,NULL,NULL);

Я понимаю использование read_fds в select - если какой-то клиент отправляет мне данные или пытается подключиться к серверу, select активируется, и read_fd будет содержать все fd, которые я могу прочитать из них , Однако у меня возникают проблемы с пониманием использования write_fds:
Я не вижу, как и когда select активизируется из-за изменения write_fd в серверной программе (и поэтому я думаю, что мне не нужно его использовать).

Я буду благодарен всем, кто разъяснит использование write_fd. Спасибо!

Ответы [ 4 ]

1 голос
/ 20 мая 2011

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

0 голосов
/ 20 мая 2011

Весь этот сложный, запутанный бизнес сокетов очень четко и полно объяснен в книге:

Вт.Ричард Стивенс, Билл Феннер и Эндрю М. Рудофф, Сетевое программирование Unix, том 1: API-интерфейс для сокетов (3-е издание)

Если вы можете найтископируйте в библиотеку, у вас будет полная информация прямо перед вами.Кроме того, будет пример кода, который, вероятно, очень близко следует к коду, который вы пытаетесь понять.

HTH

0 голосов
/ 20 мая 2011

Очень просто, когда вы отправляете ответ клиенту, может быть ситуация, когда он пока не может получить больше данных (пропускная способность / время отклика и т. д.).

В таких случаях операция записи может блокироваться.

Таким образом, вам необходимо проверить «доступность» записи для сокета, прежде чем писать в него.

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

0 голосов
/ 20 мая 2011

Если вы используете неблокирующие сокеты, набор записи сообщит вам, когда сокет будет готов отправить больше данных.

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