Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: alexis031182 от Июнь 17, 2012, 22:01



Название: Сервер на базе epoll (Linux)
Отправлено: alexis031182 от Июнь 17, 2012, 22:01
Внутренности Qt-классов QTcpServer и QTcpSocket для Linux реализованы с использованием select. Вероятно это связано с необходимостью поддержки совместимости с устаревшими версиями ядер ОС. Однако имеющийся инструментарий не позволяет при помощи стандартных Qt-классов писать высокопроизводительные серверные приложения. Для решения этой задачи подготовил три epoll класса, заменяющие собой QTcpServer.

AWebEpoll - базовый абстрактный класс (наследник QThread), обрабатывающий события epoll.
AWebEpollListener - наследник AWebEpoll. Слушает по указанному порту входящие соединения.
AWebEpollWorker - наследник AWebEpoll. Выполняет обработку событий о поступлении новых данных в сокет от клиента и событий об отправке клиенту записанных в сокет данных.

Update. В классах объявлены и отправляются сигналы. В общем-то добавил я их для наглядности, чтобы было понятно, где и какое событие возникает. В рабочем же приложении лучше отказаться от их использования. И от событий (QEvent) тоже. Практика показала, что в этом случае будет присутствовать значительное замедление. Ну я думаю понятно почему. Рекомендую использовать паттерн Медиатор для реализации обмена событиями между Listener'ом и Worker'ом (-ами), а также всеми внешними по отношению к ним классами (например классом сокета и т.п.).


Название: Re: Сервер на базе epoll (Linux)
Отправлено: alexis031182 от Июнь 18, 2012, 14:46
Альтернативный вариант - использовать наследника QAbstractEventDispatcher. Возможно кому-нибудь понравится (https://github.com/connectedtable/qeventdispatcher_epoll).