Программирование на C++ глазами хакера

         

к чтению. Когда от клиента


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

Остальной код не изменился. Мы принимаем входящее соединение с помощью функции accept, получаем новый сокет для работы с клиентом и сохраняем его в переменной sClient, После этого создается новый поток, в котором происходит обмен данными с клиентом.

Запустите пример и убедитесь, что он работает корректно. Теперь нет ошибок, и программа терпеливо ожидает соединения со стороны клиента.

Возникает вопрос, в каком режиме работает сокет sClient, который создан функцией accept. Я уже говорил, что по умолчанию сокеты работают в блокирующем режиме, и мы не изменяли это значение. Давайте проверим. Запустите приложение и попробуйте подсоединиться к серверу программой TCPClient, которая приведена в разд. 4.7.2. Клиент отправит данные, потом получит ответ " Command get OK " и после этого выдаст ошибку. Почему? Потому что мы в бесконечном цикле пытаемся получить данные от клиента, и первая попытка удачна, а вторая — нет. Значит, сокет sClient работает в том же режиме, что и сокет sServerListen.

С помощью функции select можно избавиться от второго потока, который используется для обмена данными между клиентом и сервером. Помимо этого, в примере в нынешнем виде для обработки нескольких клиентов нужно создавать множество потоков. Благодаря функции select можно все это сделать без потоков, намного проще и эффективнее. Но к этому я вернусь в главе 6, где будут рассматриваться интересные алгоритмы.

Примечание
Исходный код примера, описанного в этом разделе, вы можете найти на компакт - диске в каталоге \Demo\Chapter4\Select.

Содержание раздела