![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
slesh2000 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 24.5.2010 Репутация: нет Всего: нет |
Разбираюсь сейчас с epoll. Для теста навоял простенький echo сервер
Все вопросы по ходу кода (в комментариях)
И парочка вопросов дополнительных: 1) какое наиболее оптимальное значение для MAX_EVENTS может быть, если учесть что сервер должен обрабатывать много клиентов сразу и много данных передавать (при этом вычисления минимальны) 2) echo сервер это довольно простой вариант, а если требуется более сложные вычисления которые требуют распараллеливание запросов клиентов. т.е. допустим клиент послал запрос, сервер обработал его и ответил. Какая схема многопоточности подойдет? Вообще в голову пришла идея чтобы как только пришли данные от клиента, так сразу запускать поток для обработки или же уже иметь предварительно запущенные потоки которые ожидают вызова? Или же для linux систем чуть по другому всё? При этом fork недопустим в данном случае из-за особенностей обработки данных. 3) что можно еще использовать для увеличения скорости работы с сетью. Помимо TCP_NODELAY 4) появление каких сигналов желательно обрабатывать в данном случае? потому как столкнулся с проблемой - если записать в сокет отключенного клиента, то появляется сигнал об это. 5) как я понял при добавлении сокета в структуре epoll_event поле fd используется для удобства, а на реале я могу в ptr записать адрес структуры, которая более детально описывает клиента? 6) на Windows системах для автоматической проверки соединения использовал функцию WSAIoctl с флагом SIO_KEEPALIVE_VALS, т.е. при не активности клиента автоматически система посылала пустой пакет с данными на который клиент должен был ответить, по прошествии таймауте (если не было ответа) то соединение считалось потеряным. Если подобие такой функции на Linux системах? 7) перед закрытием сокета, надо ли его переводить обратно в блокируемый режим? |
|||
|
||||
MAKCim |
|
||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
предположительно максимальное число клиентов однако этот параметр все равно в текущей реализации не используется, так что по факту - любое количество ограничено памятью
ошибки могут быть, причем вполне стандартные типа EINTR ничего критичного здесь нет +EPOLLRDHUP если хочешь отловить момент, когда клиент завершает соединение ну и плюс, ты уверен, что не понадобится EPOLLOUT? т. е. все данные, отсылаемые клиенту, уйдут за одну операцию? достаточно закрыть через close()
должен 1 аккептор (тот, что слушает сокет в ожидании клиентов) N рабочих потоков, каждый со своим epoll (N = числу процессоров/ядер на тачке)
потюнить можно через /proc/sys/net, более детально смотри соответствующий ман главный процесс (который попрождает остальные потоки) используй в качестве advisor'а, т. е. он будет являться неким монитором, который за всем следит, перехватывает _все_ возможные сигналы (в остальных потоках их надо заблокировать), а дальше уже смотрит, что с ними делать да man 7 tcp
нет -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |