Для чего использовать параметр "fd_set * writefds" в операторе select () - PullRequest
1 голос
/ 16 августа 2011

Это прототип оператора select (согласно страницам руководства):

    int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
           struct timeval *timeout);

Я знаю, для чего использовать параметр readfds: с этим вы можете видеть, были ли данные записаны в один из ваших сокетов. С другой стороны, на странице writefds, которую я обнаружил, говорится, что нужно посмотреть, «готов ли какой-либо из сокетов отправлять данные () в». Но что это значит? В сетевом программировании Windows Sockets Куином и Шутом говорится, что он обнаруживает подключенное или доступное для записи состояние. Какой в ​​этом смысл? Неужели просто проверить, есть ли у сокета соединение с подключенным клиентом, и проверить, имеет ли смысл что-то записывать в этот сокет?

Итак: для чего обычно используют writefds?

1 Ответ

8 голосов
/ 16 августа 2011

Если вы продолжаете запись в сокет TCP, а другая сторона не получает так быстро, как вы отправляете, наступает момент, когда write блокирует .Вы хотите избежать этого, поэтому вам нужно проверить, что «вы можете писать без блокировки».Поскольку это обычно не происходит в тестовых программах, это может быть шоком, но write(2) и send(2) могут заблокировать .

Так что, если select(2) говорит fd устанавливается в writefds, то это означает, что любой write или send на нем будет записывать хотя бы один байт без блокировки.

РЕДАКТИРОВАТЬ

С стандарт :

Функция pselect () должна проверять наборы дескрипторов файлов, адреса которых передаются в параметры readfds, writefds и errorfds, чтобы определить, являются ли некоторые их дескрипторыготовы к чтению, готовы к записи или имеют исключительное состояние ожидания, соответственно.

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