Название: Сервер на базе 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).
|