?

Log in

 
 
26 January 2007 @ 01:54 am
введение в migashko::inet  

Сначала рассмотрим простой пример TCP эхо-сервера для демонстрации базовых возможностей библиотеки:

В строках 12-13 мы создаем объект сервера и запускаем его. Класс сервера определяется в строке 11. Здесь мы указываем, с каким типом данных будет работать сервер и обработчик этих самых данных, которые сервер получает от клиента. В строке 14 мы ожидаем подключение клиента. Как только клиент подключился, запускается цикл (строка 15) который и обеспечивает прием, обработку и передачу обработанных данных обратно клиенту. Метод rock() обеспечивает «перекачку» одной порции данных пришедшей от клиента. Как вы уже догадались, обработку данных обеспечивает метод doit класса echo_handler.

Класс echo_handler наследуется от handler_base, который предоставляет всего два метода-заглушки, on_init и on_release, которые обязан предоставлять обработчик. Довольно странно выглядит метод doit, который имеет два шаблонных параметра. На самом деле здесь все довольно просто. Первый параметр это ссылка на объект текущего соединения, в данном случае my_server::connection_type, а второй параметр – это тип представления принятых данных, которые, в данном случае, имеют тип std::vector.

От данного примера мало толку, т.к. он обслуживает только одного клиента и завершает работу. Попробуем изменить код сервера таким образом, чтобы он мог обрабатывать запросы множества клиентов одновременно. Для этого заменим строчки 12-15 следующим кодом:

Только что мы создали очень эффективный сервер на неблокируемых сокетах с использованием системного вызова select. Как вы уже догадались, вся работа с этой функцией скрыта в классе selector. В конструкторе, при создании объекта srv, мы передаем указатель на этот объект, и указываем, что будем работать с неблокируемыми сокетами (второй параметр). Далее запускаем сервер, и бесконечный цикл обработки. Здесь нет явных вызовов accept и rock, вся работа с этими и другими методами скрыта в библиотеке.

Селектор может работать с несколькими серверами (в данном случае под сервером мы имеем виду объект класса созданного на базе класса tcp_server или других), для этого при создании объекта просто укажите в конструкторе, с каким объектом селектора будет работать новый сервер. При вызове метода select класса selector процесс переходит в состояние ожидания, до тех пор, пока не произойдет какое-либо событие на сокетах или не истечет время ожидания, указанное в качестве параметра в миллисекундах (-1 – бесконечное время ожидания).

В следующем примере мы добавим код, который демонстрирует описанные выше и некоторые другие возможности:

В этом примере мы перегрузили метод doit, таким образом, что если типом обрабатываемых данных будет string, то каждая порция пришедших данных будет выводиться на экран, в противном случае данные просто будут переданы обратно клиенту. Для демонстрации мы создали два сервера, один из которых работает со строками, а другой с вектором символов. Таким образом, если клиент подключается по порту 3333, то на экран будут выводиться все данные, которые он передал серверу. Кроме того, мы добавили код, который выводит раз в секунду символ ‘.’, если сервер простаивает. Для тестирования можете запустить утилиту telnet и подключиться к нашему серверу по портам 3333 или 3334 и покидать ему данные.

 
 
Current Location: Дома