Концепция выбора () записи и записи fd_set - PullRequest
1 голос
/ 22 ноября 2010

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

В качестве последнего вопроса, практично ли сохранять select() подключенные сокеты для операций записи для всего сеанса?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 22 ноября 2010

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

1 голос
/ 26 ноября 2010

«Доступно для отправки» просто означает, что в буфере отправки сокета есть место.Это верно в большинстве случаев, начиная с момента установления соединения и выделения буфера.Это когда-либо не соответствует действительности, когда буфер заполняется, что, в свою очередь, происходит только при заполнении буфера приема целевого сокета, что происходит только в том случае, если приложение для чтения медленнее, чем пишущий.

1 голос
/ 23 ноября 2010

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

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