Возникла задача написания несложного сервера. Сервер должен принимать запросы клиентов, читать/писать в БД, формировать ответ и отправлять его клиентам. Протокол свой. Нагрузка и кол-во клиентов не предполагаются слишком большими, но, в тоже время и не настолько малыми, чтобы обойтись одним потоком или иметь по потоку на клиента. Лучше всего будет использование очереди запросов и пула потоков.
Есть предположение, что данная задача уже набила оскомину и человечеством давно решена. В связи с чем просьба накидать ссылок или посоветовать какую-нибудь библиотеку попроще для решения подобной задачи. Так, чтобы можно было написать код, обрабатывающий запрос и формирующий ответ, а все остальное уже было бы готовым. Платформа — Windows, язык C++. В результате должен получиться готовый автономный сервис, а не плагин к какому-нибудь апачу. Можно платное решение, но лучше бесплатное. Главное требование — попроще, чтобы можно было сделать быстро и забыть, а не класть жизнь на изучение. Есть такое?
Здравствуйте, sz36, Вы писали:
S>Есть предположение, что данная задача уже набила оскомину и человечеством давно решена. В связи с чем просьба накидать ссылок или посоветовать какую-нибудь библиотеку попроще для решения подобной задачи. Так, чтобы можно было написать код, обрабатывающий запрос и формирующий ответ, а все остальное уже было бы готовым. Платформа — Windows, язык C++. В результате должен получиться готовый автономный сервис, а не плагин к какому-нибудь апачу. Можно платное решение, но лучше бесплатное. Главное требование — попроще, чтобы можно было сделать быстро и забыть, а не класть жизнь на изучение. Есть такое?
Ищите либу API которой состоит из трёх функций: open, to_do_all, close?
Библиотека должна включать необходимый минимум.
1) Дж. Рихтер, Программирование серверных приложений для Microsoft Windows 2000
2) Дж. Рихтер. Windows для профессионалов.
3) Дж. Рихтер. Windows via C/C++
4) Бьёрн Страуструп Программирование: принципы и практика использования C++, исправленное издание.
5) Бьёрн Страуструп. Язык программирования С++
Это конечно шутка, но как известно в каждой шутке, только, доля шутки
Здравствуйте, sz36, Вы писали:
S>Hi, All!
S> Платформа — Windows, язык C++. В результате должен получиться готовый автономный сервис, S> а не плагин к какому-нибудь апачу. Можно платное решение, но лучше бесплатное.
если библиотека, то буст. если готовый сервер -- сразу вопрос: почему не http? их много маленьких и быстрых. если http не подходит, то задача сформулирована не конкретно.
> Главное требование — попроще, чтобы можно было сделать быстро и забыть, > а не класть жизнь на изучение. Есть такое?
принимать запросы и писать в db -- https://github.com/MariaDB/server или говорите что вам там на самом деле нужно.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
М>если библиотека, то буст.
Мыщьх рекоммендует буст — куда мир катится!
Я почему-то был уверен, что ты хардкорный С-шный чувак, не признающий шаблонную магию.)
Здравствуйте, sz36, Вы писали:
S>Hi, All!
S>Возникла задача написания несложного сервера. Сервер должен принимать запросы клиентов, читать/писать в БД, формировать ответ и отправлять его клиентам. Протокол свой. Нагрузка и кол-во клиентов не предполагаются слишком большими, но, в тоже время и не настолько малыми, чтобы обойтись одним потоком или иметь по потоку на клиента. Лучше всего будет использование очереди запросов и пула потоков.
S>Есть предположение, что данная задача уже набила оскомину и человечеством давно решена. В связи с чем просьба накидать ссылок или посоветовать какую-нибудь библиотеку попроще для решения подобной задачи. Так, чтобы можно было написать код, обрабатывающий запрос и формирующий ответ, а все остальное уже было бы готовым. Платформа — Windows, язык C++. В результате должен получиться готовый автономный сервис, а не плагин к какому-нибудь апачу. Можно платное решение, но лучше бесплатное.
Qt
S>Главное требование — попроще, чтобы можно было сделать быстро и забыть, а не класть жизнь на изучение. Есть такое?
Вот этот пункт Qt не удовлетворяет (если раньше не работали, а если бы работали, то вопрос бы не возникал). Хотя порог вхождения не выше, чем у рекомендованных тут boost и POCO, IMHO.
Здравствуйте, Skorodum, Вы писали:
S>Здравствуйте, мыщъх, Вы писали:
М>>если библиотека, то буст. S>Мыщьх рекоммендует буст — куда мир катится! S>Я почему-то был уверен, что ты хардкорный С-шный чувак, не признающий шаблонную магию.)
этот буст в каждом втором оперсурсе на плюсах. при сборке опенсурса под виндой (если он был для линуха) приходится о бусте иметь по крайней мере самое общее представление. и если бы автор не требовал бы плюсов -- я бы не раздумывая сказал на каких библиотеках для питона это можно сделать легко и непринужденно. а так...
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, мыщъх, Вы писали:
М>если библиотека, то буст. если готовый сервер -- сразу вопрос: почему не http? их много маленьких и быстрых. если http не подходит, то задача сформулирована не конкретно.
В идеальном случае мне бы хотелось, конечно, уже готовый сервер в виде библиотеки или открытого проекта, чтобы можно было написать что-то типа:
int main()
{
Server->RegisterCallback(&MyFunction);
Server->Run();
}
Где MyFunction() — моя функция, которая на входе получает запрос, принятый от клиента, а на выходе формирует ответ на этот запрос. А сервер сам открывает сокет, асептит входящие соединения, принимает/передает, ставит запросы в очередь, распределяет по им же созданным потокам, закрывает мертвые соединения, следит за таймаутами, пишет лог и проч. И главное — корректно обрабатывает ошибки.
Понятно, что в такой постановке задача нерешаема, поскольку серверу, как минимум, нужно знать, где кончается запрос, чтобы передать его в MyFunction()(у нас же поток, поскольку TCP). Но, в общем, что-то близкое, чтобы можно было допилить или настроить сервер на нужный формат запроса.
HTTP сервер, теоретически, наверное можно использовать, но мне не кажется, что это самое простое решение задачи. А хочется именно простого. И еще кажется, что задача настолько типовая, что должны существовать готовые велосипеды.
Здравствуйте, sz36, Вы писали:
S>Здравствуйте, мыщъх, Вы писали:
М>>если библиотека, то буст. если готовый сервер -- сразу вопрос: почему не http? их много маленьких и быстрых. если http не подходит, то задача сформулирована не конкретно.
S> В идеальном случае мне бы хотелось, конечно, уже готовый сервер в виде библиотеки или открытого проекта, чтобы можно было написать что-то типа: S>
S>Где MyFunction() — моя функция, которая на входе получает запрос, принятый от клиента,
http сервер обычно позволяет вам написать свою реализацию функции, вызываемой при получении данных и их декодировании (они могут быть пожаты или зашифрованы).
S>HTTP сервер, теоретически, наверное можно использовать, но мне не кажется, что это самое простое решение задачи.
как раз самое простое и к тому же расширяемое. если завтра потребуется вдруг шифрование или авторизация -- так оно уже есть. вам же не нужно самому писать. оно уже в библиотеках.
S> А хочется именно простого. И еще кажется, что задача настолько типовая, что должны существовать готовые велосипеды.
один из них -- http. еще есть apache qpid. возможно, он вам подойдет лучше всего.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Здравствуйте, sz36, Вы писали:
S>Возникла задача написания несложного сервера. Сервер должен принимать запросы клиентов, читать/писать в БД, формировать ответ и отправлять его клиентам. Протокол свой. Нагрузка и кол-во клиентов не предполагаются слишком большими, но, в тоже время и не настолько малыми, чтобы обойтись одним потоком или иметь по потоку на клиента. Лучше всего будет использование очереди запросов и пула потоков.
Если нужно работать с сокетами самостоятельно (т.е. принимать соединения, вычитывать данные из них, десериализовать прочитанные, сериализовать исходящие, записывать, контролировать доступность/недоступность каналов для записи/чтения), то нужно смотреть в сторону Asio, libuv, libevent, POCO, ACE или даже Qt.
Если кроме собственно работы с каналами нужно еще организовывать рабочие потоки для других операций (вроде работы с БД), то тут нужно либо самостоятельно делать очереди сообщений на основе одного из вышеперечисленных инструментов (в ACE, например, есть очереди сообщений и возможности выстраивать в цепочки объекты-обрабочики очередей сообщений, но не очень удобные). Либо использовать более специализированные для обработки потоков сообщений инструменты. Вроде CAF (но там поддержка Windows только за счет MinGW) или SObjectizer. В этом случае работы с IO будут на одном фреймворке, обработка прикладных сообщений/запросов -- на другом.
В случае выбора SObjectizer можно будет расчитывать на помощь его русскоязычных разработчиков
Здравствуйте, sz36, Вы писали:
S>Hi, All!
S>Возникла задача написания несложного сервера. Сервер должен принимать запросы клиентов, читать/писать в БД, формировать ответ и отправлять его клиентам. Протокол свой. Нагрузка и кол-во клиентов не предполагаются слишком большими, но, в тоже время и не настолько малыми, чтобы обойтись одним потоком или иметь по потоку на клиента. Лучше всего будет использование очереди запросов и пула потоков.
Здравствуйте, sz36, Вы писали:
S>HTTP сервер, теоретически, наверное можно использовать, но мне не кажется, что это самое простое решение задачи. А хочется именно простого. И еще кажется, что задача настолько типовая, что должны существовать готовые велосипеды.
Зато Вы получаете возможность траверса через всякие там файрволы и т.п., ибо на них с высокой вероятностью может быть правило по пробросу http. Очень пригодится при дальнейшем развёртывании.