Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> стоит ли писать HTTP сервер на MFC? интерфейс написан на MFC 
V
    Опции темы
asmdzen
Дата 24.5.2011, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Пишу небольшой HTTP сервер, писал интерфейс на MFC, стоит ли писать серверную часть тоже на MFC?
или все же лучше использовать boost::asio или чистые сокеты?
PM MAIL   Вверх
igsilya
Дата 24.5.2011, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



сам только что закончил писать HTTP сервер. По моему лучше чистых сокетов ничего не существует. Стивенс вам в помощь. smile 
PM MAIL   Вверх
asmdzen
Дата 24.5.2011, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



igsilya, не очень хочется заморачиваться потоками вручную )

будет ли это правильным решением - объект-поток создается с помошъю new, при завершении работы потока убивать этот объект с помошъю auto_ptr который указывает на this?
PM MAIL   Вверх
boostcoder
Дата 24.5.2011, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



зачем писать?
тут 4 штуки уже написанных  smile

Добавлено через 6 минут и 26 секунд
Цитата(asmdzen @  24.5.2011,  20:03 Найти цитируемый пост)
бъект-поток создается с помошъю new, при завершении работы потока убивать этот объект с помошъю auto_ptr который указывает на this?

по потоку на клиента? smile 
PM WWW   Вверх
igsilya
Дата 24.5.2011, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



Цитата(boostcoder @ 24.5.2011,  20:44)
по потоку на клиента? smile

ну вообще-то так обычно и делают. Еще раз говорю: почитайте "Стивенс У. Р. -разработка сетевых приложений."
PM MAIL   Вверх
boostcoder
Дата 24.5.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(igsilya @  24.5.2011,  20:57 Найти цитируемый пост)
так обычно и делают

я наверное не те книжки читал smile

Цитата(igsilya @  24.5.2011,  20:57 Найти цитируемый пост)
"Стивенс У. Р. -разработка сетевых приложений."

эту книжку не читал. но по потоку на клиента - тупиковая архитектура.
PM WWW   Вверх
asmdzen
Дата 24.5.2011, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



boostcoder, можете документацию какую предложить? интересен сам подход к проектированию сервера.
PM MAIL   Вверх
boostcoder
Дата 24.5.2011, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



обычные архитектуры: 1)пул потоков, 2)сопрограммы.

Добавлено через 1 минуту и 38 секунд
Цитата(asmdzen @  24.5.2011,  21:07 Найти цитируемый пост)
сам подход к проектированию сервера

подход и архитектура формируются на основании требований. у вас их не видно.

Добавлено через 10 минут и 37 секунд
еще вариант - использовать libevent, если boost сложен. там есть возможность просто создать http сервер.
http://monkey.org/~provos/libevent/doxygen-1.4.10/index.html
http://monkey.org/~provos/libevent/doxygen.../evhttp_8h.html

Добавлено через 11 минут и 12 секунд
и вот: http://incpp.blogspot.com/2009/05/http-libevent.html
PM WWW   Вверх
igsilya
Дата 24.5.2011, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



Цитата(boostcoder @  24.5.2011,  21:07 Найти цитируемый пост)
обычные архитектуры: 1)пул потоков, 2)сопрограммы.


и вы хотите сказать, что в пуле потоков не по потоку на клиента?
или тогда поясните что именно вы имели ввиду под сочетанием "по потоку на клиента".
PM MAIL   Вверх
boostcoder
Дата 24.5.2011, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(igsilya @  24.5.2011,  21:19 Найти цитируемый пост)
и вы хотите сказать, что в пуле потоков не по потоку на клиента?

естественно нет.

Это сообщение отредактировал(а) boostcoder - 24.5.2011, 21:22
PM WWW   Вверх
igsilya
Дата 24.5.2011, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



Цитата(boostcoder @  24.5.2011,  21:21 Найти цитируемый пост)
естественно нет.

а не могли бы вы рассказать как это так можно эффективно обрабатывать сразу одновременно 2 запроса одним потоком.
PM MAIL   Вверх
boostcoder
Дата 24.5.2011, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(igsilya @  24.5.2011,  21:27 Найти цитируемый пост)
как это так можно эффективно обрабатывать сразу одновременно 2 запроса одним потоком.

долго объяснять.
в двух словах: неблокирующие сокеты и операции с ними в виде задач. т.е. к примеру, чтение из сокета в терминах asio - это задача. формирует задачу и управляет ею asio::io_service.
в общем доку читайте: "The Proactor Design Pattern: Concurrency Without Threads"

Это сообщение отредактировал(а) boostcoder - 24.5.2011, 21:38
PM WWW   Вверх
borisbn
Дата 24.5.2011, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



> Пишу небольшой HTTP сервер, писал интерфейс на MFC
Объясните несведущему в серверостроении - как у http-сервера м.б. интерфейс?

А по вопросу - нет. Не стОит, потому, что MFC - труп, даже не ходячий, а еле ползающий. См. в сторону boost или Qt


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
igsilya
Дата 24.5.2011, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



Цитата(borisbn @  24.5.2011,  21:58 Найти цитируемый пост)
Объясните несведущему в серверостроении - как у http-сервера м.б. интерфейс?

видимо автору лень или неудобно делать конфиг. файлы (или логи) или просто делать вывод в стандартные потоки, и он решил вынести настройки и какую-нибудь отладочную инфу в графику.
PM MAIL   Вверх
borisbn
Дата 24.5.2011, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Я вот тут подумал, м.б. автор хотел сказать
Пишу небольшой HTTP сервер. До этого писал только интерфейс и только на MFC
???
тогда понятно.

Это сообщение отредактировал(а) borisbn - 24.5.2011, 22:16


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
igsilya
Дата 24.5.2011, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



Цитата(boostcoder @  24.5.2011,  21:01 Найти цитируемый пост)
по потоку на клиента - тупиковая архитектура.



на сколько мне известно (я конечно могу ошибаться) большинство современных серверов (apache например) используют пулы потоков без всякой там адской асинхроники (честно не совсем понял ту документацию, что вы предложили) и прекрасно справляются даже с очень большими нагрузками.
PM MAIL   Вверх
boostcoder
Дата 24.5.2011, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(igsilya @  24.5.2011,  22:19 Найти цитируемый пост)
большинство современных серверов (apache например) используют пулы потоков

ну так не архитектуру "клиент = поток". хотя исходников апача не видел. но тупиковость архитектуры очевидна. вряд-ли они такое гэ закодили.

PM WWW   Вверх
igsilya
Дата 24.5.2011, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



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

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

здесь как раз 1 поток = 1  запрос.

или я чего-то не понимаю?
PM MAIL   Вверх
boostcoder
Дата 24.5.2011, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



все не так.
говоря об пуле потоков и asio, имеется ввиду, что пул потоков используется для обработки задач io_service`а. 
клиентов/подключений/чтений/записей, или чего бы то ни было еще, в терминах asio не существует. есть только задачи. а операции с сокетами - это процедуры формирующие задачи предназначенные для работы с сокетами.

PM WWW   Вверх
asmdzen
Дата 24.5.2011, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



В общем это задание, нужно было написать прогу типа прокси, у нее есть интерфейс на мфк который показывает лог. Загвоздка была в том что я с мфк знаком был только отдаленно, но все же интерфейс добил. Остался сам прокси, парадокс в том что я с интернет трафиком знаком очень близко - писал снифферы/грабберы, протоколы понимаю нормально, но вот с сокетами редко связывался - и то для отправки файлов или каких-то пингов.
Прокси уже пишу на мфк так как нашел вроде нормальные примеры. Мне тоже непонятна идея с пулом потоков если каждый запрос обрабатывается не отдельным потоком.

запрещено использовать что-либо кроме мфк, стл и буста.

Это сообщение отредактировал(а) asmdzen - 24.5.2011, 23:00
PM MAIL   Вверх
boostcoder
Дата 24.5.2011, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



libevent кстати, устроенна по такому же принципу. только менее абстрагирована. ибо там задачи идентифицируются по дескриптору(файловому/сокетному).
в asio же, задачей может быть что угодно. в прямом смысле.

PM WWW   Вверх
asmdzen
Дата 24.5.2011, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



boostcoder, получается значит не совсем асинхронно, ведь если на все потоки пула придет по команде типа Receive то они все зависнут на время, не так?
PM MAIL   Вверх
boostcoder
Дата 24.5.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



igsilya, asmdzen, касательно пула потоков и asio - вы все неверное понимаете. очень рекомендую читать доку с самого начала и до конца.
пул потоков в asio используется только для обработки задач io_service`ом. в коде, при работе с сокетами, не нужно знать о том что используется пул потоков. io_service сам распределяет задачи(в данном случае задачи для работы с сокетами) между потоками пула.

PM WWW   Вверх
igsilya
Дата 24.5.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



кто в лес, кто по дрова.
я говорю о чистых сокетах без использования сторонних библиотек-оберток и надстроек.

Добавлено через 5 минут и 25 секунд
Цитата(boostcoder @  24.5.2011,  23:04 Найти цитируемый пост)
пул потоков в asio используется только для обработки задач io_service`ом

так основное время работы сервера как раз и занимают операции ввода-вывода(http сервер по сути больше ничего делать и не должен) 

Цитата(boostcoder @  24.5.2011,  23:04 Найти цитируемый пост)
io_service сам распределяет задачи(в данном случае задачи для работы с сокетами) между потоками пула.


=> весь сервер исходя из ваших слов т.е. его I/O часть работает как раз по принципу , похожему на тот который я описал.


PM MAIL   Вверх
boostcoder
Дата 24.5.2011, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(asmdzen @  24.5.2011,  22:59 Найти цитируемый пост)
не так?

не совсем. тут еще важно понимать, что разные задачи реализованы по разному.
к примеру задачи чтения/записи из/в сокет, в недрах asio, разбиваются на подзадачи. т.е. из сокета в один момент времени читается столько байт, сколько можно прочесть без блокировки. т.е. если вы выполнили async_read() для 1024 байт а для чтения доступно только 32 - то прочтется только 32. остальные прочтутся когда будут доступны. таким образом, задачи чтения/записи делятся на подзадачи. не явно. но задача полностью завершится тогда, когда сумма прочитанных байт всеми подзадачами будет равна 1024.
PM WWW   Вверх
asmdzen
Дата 24.5.2011, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



boostcoder, спасибо за объяснение, просто при просмотре примеров на бусте волосы дыбом встают - много новых элементов, например я никогда не использовал boost::bind, а он там постоянно мелькает )
потом надо будет объяснять что это делает в моем коде )
насколько я понял boost::asio и есть самый выгодный вариант (особенно если он сам работает с пулом smile)
PM MAIL   Вверх
boostcoder
Дата 24.5.2011, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(igsilya @  24.5.2011,  23:04 Найти цитируемый пост)
я говорю о чистых сокетах без использования сторонних библиотек-оберток и надстроек.

я говорю об asio. на протяжении всей дискуссии.

Цитата(igsilya @  24.5.2011,  23:04 Найти цитируемый пост)
весь сервер исходя из ваших слов т.е. его I/O часть работает как раз по принципу , похожему на тот который я описал.

от части. но очень отдаленно.

Добавлено @ 23:15
asmdzen, кстати http-proxy: http://alexott.net/ru/cpp/BoostAsioProxy.html
и еще, на libevent: http://monkey.org/~marius/pages/?page=nylon


Это сообщение отредактировал(а) boostcoder - 24.5.2011, 23:18
PM WWW   Вверх
igsilya
Дата 24.5.2011, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



Цитата(boostcoder @  24.5.2011,  23:12 Найти цитируемый пост)
от части.

получается, что вы назвали "тупиковой" дну из основных составляющих  того что так усердно расхваливаете. Не противоречите ли вы сами себе?

+ко всему мной описанная схема будет работать на чистых сокетах гораздо эффективнее(предположение), т.к. в ней нет никаких нагромождений сверху.
PM MAIL   Вверх
asmdzen
Дата 24.5.2011, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



придется наверное все-таки писать под бустом, с мфк не канает что-то, поставил Sleep(10000) при Receive и засыпает вся прога - а я думал у них какие-то потоки есть (
PM MAIL   Вверх
bsa
Дата 24.5.2011, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(igsilya @ 24.5.2011,  23:23)
Цитата(boostcoder @  24.5.2011,  23:12 Найти цитируемый пост)
от части.

получается, что вы назвали "тупиковой" дну из основных составляющих  того что так усердно расхваливаете. Не противоречите ли вы сами себе?

+ко всему мной описанная схема будет работать на чистых сокетах гораздо эффективнее(предположение), т.к. в ней нет никаких нагромождений сверху.

"Не читал, но осуждаю" ©

Рекомендую серьезно ознакомиться с Asio. Возможно, после этого взгляд на мир будет совсем иной. А для затравки скажу: у меня однопоточный сервер (что-то типа SSL прокси и без пула потоков) может обрабатывать тысячи одновременных подключений (т.е. я проводил стресс тестирование, но обычная нагрузка порядка нескольких десятков-сотни). Причем, сильно нагруженных. Написан с использованием boost::asio.

Добавлено через 1 минуту и 3 секунды
asmdzen, тебе сказали, MFC давно труп. Использование его стоит свести к минимуму.
PM   Вверх
igsilya
Дата 24.5.2011, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.9.2009

Репутация: нет
Всего: нет



Цитата(bsa @  24.5.2011,  23:35 Найти цитируемый пост)
 однопоточный 



на сколько я понял получается он "однопоточным" только для внешнего пользователя библиотеки, а на самом деле это все происходит через кучу потоков(или чего-то еще), реализующих асинхронику на более низком уровне.
PM MAIL   Вверх
boostcoder
Дата 24.5.2011, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(igsilya @  24.5.2011,  23:23 Найти цитируемый пост)
получается, что вы назвали "тупиковой" дну из основных составляющих  того что так усердно расхваливаете. Не противоречите ли вы сами себе?

читайте с начала.

Цитата(igsilya @  24.5.2011,  23:23 Найти цитируемый пост)
ко всему мной описанная схема будет работать на чистых сокетах гораздо эффективнее(предположение), т.к. в ней нет никаких нагромождений сверху

голословное утверждение.

Цитата(bsa @  24.5.2011,  23:35 Найти цитируемый пост)
у меня однопоточный сервер (что-то типа SSL прокси и без пула потоков) может обрабатывать тысячи одновременных подключений (т.е. я проводил стресс тестирование, но обычная нагрузка порядка нескольких десятков-сотни). Причем, сильно нагруженных. Написан с использованием boost::asio.

я в одном из проектов, при ~3800 клиентов онлайн, получил в пике ~220000 запросов/ответов в секунду. это с учетом логики повешенной на запросы/ответы. если ее исключить, повысится больше чем вдвое.

Добавлено через 1 минуту и 12 секунд
Цитата(igsilya @  24.5.2011,  23:43 Найти цитируемый пост)
на сколько я понял получается он "однопоточным" только для внешнего пользователя библиотеки, а на самом деле это все происходит через кучу потоков(или чего-то еще), реализующих асинхронику на более низком уровне

в третий раз вы все неправильно поняли.

Цитата(boostcoder @  24.5.2011,  23:47 Найти цитируемый пост)
читайте с начала.


PM WWW   Вверх
borisbn
Дата 25.5.2011, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(bsa @  24.5.2011,  23:35 Найти цитируемый пост)
у меня однопоточный сервер

Цитата(bsa @  24.5.2011,  23:35 Найти цитируемый пост)
может обрабатывать тысячи одновременных подключений

Вот тут непонятно.
Если в программе один поток, то подключения обрабатываются последовательно. Нет ?
Если же распараллеливание берёт на себя asio, то сервер, всё-таки, не однопоточный.
Или же, если под "обработкой" считать то, что запрос принят, и обработка (подготовка ответа и выдача его клиенту) поставлена в очередь, то, наверное, можно сказать, что подключения обрабатываюся одновременно.
Растолкуйте, где я не прав, пожалуйста.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 25.5.2011, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(borisbn @  25.5.2011,  00:23 Найти цитируемый пост)
Если в программе один поток, то подключения обрабатываются последовательно. Нет ?

я так понял, что речь о приеме подключений. если да - то принятие подключения(accept) выполняется поочередно.

Цитата(borisbn @  25.5.2011,  00:23 Найти цитируемый пост)
Если же распараллеливание берёт на себя asio, то сервер, всё-таки, не однопоточный.

не понятно, откуда взято мнение о том, что asio создает какие-то потоки?! никаких потоков для эмитации асинхронности asio не создает!
единственное исключение это:
Цитата

n additional thread per io_service is used to emulate asynchronous host resolution. This thread is created on the first call to either ip::tcp::resolver::async_resolve() or ip::udp::resolver::async_resolve().

http://www.boost.org/doc/libs/1_46_1/doc/h...ementation.html
Цитата(borisbn @  25.5.2011,  00:23 Найти цитируемый пост)
Или же, если под "обработкой" считать то, что запрос принят, и обработка (подготовка ответа и выдача его клиенту) поставлена в очередь, то, наверное, можно сказать, что подключения обрабатываюся одновременно.

принятие запроса на подключение - асинхронная операция. поэтому да, принятие подключений происходит асинхронно по отношению к остальным операциям с сокетами.

PM WWW   Вверх
asmdzen
Дата 25.5.2011, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



только утром до меня дошло, все базируется на winsocket'ах (если писать под винду), МФК работает примерно так:
есть цикл обработки сообщений от винды, при создании нового сокета - его данные помещяются в определенный список получателей сообщений, сокет работает асинхронно в том смысле что при поступлении данных он получает их все и уже после посылает своему объекту сообщение о принятии (OnReceive обработчик), получается что если у меня больше одного CSocket'а операции с ними будут происходить по очереди (одно сообщение за раз), но зато при Receive никаких лагов не будет - сокет уже получил данные и просит чтоб объект их обработал. (из-за цикла обработчика сообщений при моем Sleep'е замирала вся прога - сообщения для окна обрабатываются в том-же цикле smile)

boostcoder, можете коротко описать процес создания сервера на бусте? например какой класс за что отвечает, какой между объектами происходит обмен данными?
PM MAIL   Вверх
boostcoder
Дата 25.5.2011, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(asmdzen @  25.5.2011,  08:20 Найти цитируемый пост)
процес создания сервера на бусте

какого именно сервера?

PM WWW   Вверх
asmdzen
Дата 25.5.2011, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



простой сервер который принимает соединения от клиентов и может принимать потом от них данные,
типа conListener который ждет новых соединений, при их поступлений создается новый сокет который и получит это соединение - он способен получить какие-то данные, обработать их и отослать ответ клиенту.
еще загвоздка получилась, если сервер(отдельный сокет) получил от клиента запрос который потребует время для выполнения (напр. создание нового соединение, получения данных от другого клиента), как это реализовать?
PM MAIL   Вверх
boostcoder
Дата 25.5.2011, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(asmdzen @  25.5.2011,  08:39 Найти цитируемый пост)
простой сервер который принимает соединения от клиентов и может принимать потом от них данные

смотри пример чата: http://www.boost.org/doc/libs/1_46_1/doc/h...o.examples.chat

Добавлено через 2 минуты и 27 секунд
Цитата(asmdzen @  25.5.2011,  08:39 Найти цитируемый пост)
еще загвоздка получилась, если сервер(отдельный сокет) получил от клиента запрос который потребует время для выполнения (напр. создание нового соединение, получения данных от другого клиента), как это реализовать?

ожидание данных от клиента не блокирует очередь задач io_service`а. никакой проблемы нет.

PM WWW   Вверх
asmdzen
Дата 25.5.2011, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



boostcoder, в общем я восхищен ) даже не знаю почему раньше этим не пользовался )
приходилось все писать вручную
теперь почти все понятно (не исключены вопросы в будущем), попробую написать на бусте.
так понимаю создается io_service который обрабатывает все, для него создается отдельный поток, в этом потоке обрабатываются все запросы сделанные при помощи post.
PM MAIL   Вверх
boostcoder
Дата 25.5.2011, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(asmdzen @  25.5.2011,  09:16 Найти цитируемый пост)
io_service который обрабатывает все, для него создается отдельный поток

отдельный поток создавать не обязательно. весь сервер может работать всего в одном потоке. это если не требуется повышенная производительность.

Цитата(asmdzen @  25.5.2011,  09:16 Найти цитируемый пост)
в этом потоке обрабатываются все запросы сделанные при помощи post

post - это явный способ положить в очередь задач свою задачу. а в недрах, все асинхронные операции неявно создают объект задачи и добавляют его в очередь. вот только не уверен что именно при помощи post метода.

PM WWW   Вверх
asmdzen
Дата 25.5.2011, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



в общем все понятно, сейчас применил мфк, для себя буду писать только под буст )
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1080 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.