#sockets #blocking
#сокеты #блокировка
Вопрос:
прослушивающий сокет отвечает за прием нового клиентского сокета :
sock_client = accept(sock_listen, NULL, NULL)
В типичном C / S-приложении, каков наилучший выбор режима блокировки прослушивающего сокета и клиентского сокета?
Ответ №1:
Если у вас есть поток и вы можете выделить поток для сокета, тогда блокируйте. Если это не так, то на сервере неблокирующий. От клиента зависит, есть ли у вас что-то лучшее, что можно сделать. Блокирующий, если нет, неблокирующий, если вы делаете.
Комментарии:
1. Я согласен с прослушивающим сокетом; Но что касается части клиентского сокета, не могли бы вы подробнее рассказать об этом?
2. Рассмотрим клиентское приложение, такое как ftp. Когда ftp пытается выполнить команду, запрошенную пользователем, ему не нужно делать ничего другого. Если пользователь хочет прервать, ^ C отправляет сигнал, который прерывает блокирующий ввод-вывод. Сравните это с веб-браузером, подключенным к тому же ftp-сайту. Веб-браузер должен прослушивать нажатия кнопок, возможно, анимировать некоторые GIF-файлы, обрабатывать графические запросы на обновление, проверять RSS-канал и т.д. Все это при выполнении протокола ftp. В первом случае может использоваться блокирующий ввод-вывод. Второй должен использовать неблокирующий (при условии, что он был непоточным).
3. @DriverBoy: ссылок / lynx / curl / wget может и не быть. И прежде чем вы это скажете, хотя curl, возможно, и не анимирует gif, он все еще запускает индикатор выполнения и вычисляет скорость загрузки, даже ожидая сетевого ввода-вывода. Но да, в общем случае они являются потоковыми.