Подтвердить что ты не робот

Выбор функции в программировании сокетов

Может ли кто-нибудь сказать мне использование и применение функции select в программировании сокетов в c?

4b9b3361

Ответ 1

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

Предположим, вы хотите написать программу, которая реагирует на события, поступающие из нескольких источников событий, например. сеть (через сокеты), ввод пользователя (через stdin), другие программы (через каналы) или любой другой источник событий, который может быть представлен fd. Вы можете запускать отдельные потоки для обработки каждого источника событий, но вам нужно будет управлять потоками и решать проблемы concurrency. Другой вариант - использовать механизм, в котором вы можете объединить все fd в единый объект fdset, а затем просто вызвать функцию, которая будет ждать на fdset. Эта функция будет возвращаться всякий раз, когда событие происходит на любом из fd. Вы можете проверить, в каком fd произошло событие, прочитать fd, обработать событие и ответить на него. После того, как вы это сделали, вы вернетесь и сядете в эту функцию ожидания - до появления другого события на некотором fd.

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

Ответ 2

Функция выбора позволяет вам проверять несколько разных сокетов или труб (или любые дескрипторы файлов вообще, если вы не на окнах) и делать что-то на основе того, что будет готово в первую очередь. Более конкретно, аргументы для функции select разбиваются на три группы:

Чтение: Когда любой из дескрипторов файлов в этой категории готов к чтению, выберите, вернет их вам.

Запись: Когда любой из дескрипторов файлов в этой категории готов к записи, выберите, вернет их вам.

Исключительные: Если какой-либо из дескрипторов файлов в этой категории имеет исключительный случай - то есть они закрываются нечисто, соединение прерывается или у них есть другая ошибка - select вернет их вам.

Сила выбора заключается в том, что отдельные функции file/socket/pipe часто блокируются. Select позволяет отслеживать активность нескольких файловых дескрипторов без необходимости выделять поток вашей программы для каждого вызова функции.

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

Ответ 3

select() - это низкотехнологичный способ опроса сокетов для чтения новых данных или для открытого окна TCP для записи. Если у вас нет веских причин, вам, вероятно, лучше использовать poll() или epoll_wait(), если ваша платформа имеет его, для лучшей производительности.

Ответ 4

Более подробная информация была бы хорошей, но я думаю, что вы имеете в виду метод Java NIO Selector.select().

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

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

Вот большой учебник, который должен прояснить ситуацию:

http://rox-xmlrpc.sourceforge.net/niotut/

Ответ 5

В документации по файлам Linux и MSDN для Windows,

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

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

Пример: представьте, что вы загружаете большую страницу Facebook на свой смартфон во время поездки по поезду. Ваше соединение прерывистое и медленное, веб-сервер должен иметь возможность обрабатывать другие клиенты, ожидая завершения связи.

Ответ 6

Мне нравится описание gnu.org:

Иногда программа должна принимать входные данные на нескольких входных каналах всякий раз, когда поступает вход. Например, на некоторых рабочих станциях могут быть такие устройства, как таблетка для оцифровки, функциональная кнопочная панель или циферблат, которые подключаются через обычные асинхронные последовательные интерфейсы; хороший стиль пользовательского интерфейса требует немедленного ответа на ввод на любом устройстве. [...]

Обычно для этого нельзя использовать read, потому что это блокирует программу, пока вход не будет доступен в одном конкретном дескрипторе файла; вход на другие каналы не разбудит его. Вы можете установить неблокирующий режим и опросить каждый дескриптор файла по очереди, но это очень неэффективно.

Лучшим решением является использование функции select. Это блокирует программу до тех пор, пока вход или выход не будут готовы к указанному набору дескрипторов файлов или до истечения таймера, в зависимости от того, что наступит раньше.