Рейтинг:  4 / 5

Звезда активнаЗвезда активнаЗвезда активнаЗвезда активнаЗвезда не активна
 

Мысли об идеальной альтернативе 1С МОЕЙ мечты, изложенные ранее, привели меня к мыслям о том, а как это все спрограммировать? 

 Я1: Хехе, никак, нема столько свободного времени, да и знаний нет.

 Я2: Ну как это нет знаний, "ТЫЖ ПРОГРАММИСТ" или кто?

 Я1: Я узкоспециализированный инженер. Я, кроме как на языке 1С, уже много лет ни на чем не кодил.

 Я2: Ты институт закончил! Ты курсы по c++ посмотри на ютюбе!

 Я1: Смотреть не кодить. А время где взять?

 Я2: Ну начни с малого, напиши сервер, который будет работать по http протоколу и что-то отдавать клиенту.

 Я1: Что-то?

 Я2: Для начала Hellow world, а потом хотя бы список баз, а потом список справочников в базе, а потом содержимое справочника, а потом...

 Я1: Воу, воу, палегче. Давай Hellow world и хватит на сегодня. Ну что гугл рассказывай, где кодить, на чем, чего качать, чего запускать, чего писать?

 Гугл: Да господин, вот тебе 100500 форумов где обсуждают как сделать web сервер.

 Я1: не, никаких java, я в ТЗ написал, что чисто машинный код, быстро и без накладных расходов, вся производительность зависит от меня. Никаких виртуальных машин, эмуляторов, интерпритаторов, фреймворков...

 Я1: c++ давай

 Гугл: Да господин, вот тебе 10 сайтов отдаленно похожих на то, что нужно.

 Я1: ну ок, начнем.

 

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

В этой статье вводная БЛА-БЛА-БЛА, о том что, где и как я делал, примеры кода будут в отдельной статье.

Первым делом я поискал, среду разработки. В институте на c++ мы кодили под никому, кроме препода, не нужную ОСь gynix (надеюсь правильно написал название). Это делалось в досовском (не знаю как правильно, для меня все текстовые ОСи - ДОС) блокноте и компилилось в командной строке. На ней мы изучали параллельные процессы, сокеты и семафоры, вроде, то что нужно, но про эту ось даже википедия не знает, и мне надо под винду, а там все немного по другому.

Почему-то я остановился на бесплатной версии Visual Studio 2015. Не самый лучший вариант для написания чисто c++. Весит эта беда чуть ли не 10гигов!!! Нашел еще альтернативу в 45 мегабайт, но она была стара как динозавр, хотя меня сто пудов устроила бы. Вот так я начал борьбу за быстрый и оптимальный код со скачивания IDE в 10 Гектар, когда есть альтернатива в 45 метров. Ссылку на сайт MS писать не буду, гугл с яндексом их и так знают.

VS 2015 требует учетку в виндовых облаках, т.к. я уже имел дома бук с десятой виндой, таковая учетка у меня уже была. Учетка понадобится после установки. Поэтому первым делом качаем установщик VS2015. Он весит мало. После запуска он начинает качать свои Гектары и устанавливать. Все проходит просто и на ура, количество Гектар зависит от количества галок, ставьте те галки где есть слова c++. Остальные как хотите, много не мало.

Как медленно она стартует... ооооооооооооооочень медленно. Я сейчас не о самом первом запуске, а о каждом запуске. Эта сцука лезет в интернет при старте и подолгу ждет оттуда ответа, и полюбому сливает весь мой код и софт в свои облака. Ну просто других причин так долго включаться на современном компе у неё нет, кроме как лить в облака мои данные.

После запуска все дальнейшие действия работают быстро, IDE отзывчивая и четкая. Как-то баловался с Android Studio, так там лаги при каждом чихе, а тут только при запуске. Вообще, я лукавлю, мой комп уже не современный, но ВАТЬ МАШУ, там 8 ядер, 8Гб оперативы, SSD диск, там такие мегагерцы... я просто не знаю, сколько можно было сложить чисел и записать результатов в файлы за это время. Короче везде одни и те же проблемы, что в 1С, что в MS, что в гугле - на современном железе все подлагивает. Меня немного бесит, что эти монстры заставляют заниматься мое железо не тем, что я запланировал, а на мои дела оставляют лишь доли одного процента ресурсов. Они в режиме реального времени отслеживают мои нажатия клавиш, а я из-за это жду, когда IDE мне откроет пустой проект, без единого файла.

Ну да ладно, к черту эмоции, IDE открыта, на эране пустой файл main.cpp и надо писать. Что писать, товарищ гугл?

Для начала я узнал, что писать процедуру точки входа можно по разному. Узнал я это методом тыка, читая разные примеры в интернетах. Полного понимания до сих пор нет, можно void main(), можно int main(), можно с параметрами и без, а можно winapi main(), а можно WinMain... короче я остановился на int main(), что приводит к тому, что вылазит консоль. Это удобно для вывода сообщений, но в реальности нах не нужна. Никому не нужно консольное окошко на каждую запущенную службу на компе.

А потом я узнал, как выводить сообщения и работать со строками. printf уже не в моде и надо пользоваться потоками. Я не уверен, что это эффективно по производительности, но по потокам больше всего примеров, поэтому Hellow world, сделаем на потоках. Хотя в http сплошь и рядом работа с длинными текстами, тут надо будит все поизучать.

А потом я нашел пример чата написанного на сокетах и узнал как с ними работать. Теорию о сокетах Беркли я прочитал в википедии, но там пример для unix, в винде все тоже самое, но чуть чуть по другому. Другой заголовочный файл нужен, другие параметры в функциях... но теорию надо знать, поэтому читаем Википедию.

После теории о сокетах почитал про протокол http, тут я прочел только начало, для hellow world кроме того, что протокол текстовый больше знать и не надо. Я понял, что он текстовый, а значит мне надо на любой входящий пакет ответить текстом с заголовком и содержимым, которое в моем случае будет простеньким html с надписью ПРИВЕТ МИР. Пример заголовка http пакета найти проще простого.

Так как мы тут балуемся на дальнейшее развитие, позже почитаем поподробнее, но уже сейчас помимо ПРИВЕТ МИР, выведем в html текст входящего запроса. Это позволит увидеть что отправлют разные браузеры нам.

 

Теперь накидав в мозг теории, надо продумать функционал программы. Итак мы вешаем в основном цикле программы прослушку определенного (пока жестко в коде) порта на предмет новых соединений. Ловля соединений делается вызовом функции accept(). Она блокирующая, т.е. выполнение нашей программы останавливается, до появления входящего соединения. После установки соединения нам надо поймать N пакетов, где N от 0 до бесконечности. По умолчанию браузер держит соединение, пока его не закроют (как окахзалось не все и не всегда). Пакеты ловятся функцией recv(), котораятоже блокирующая и программа останавливается, пока не прийдет пакет или соединение не разорвется.

Тут и есть засада, т.к. к нашему серверу могут конектится много клиентов и нам надо обслуживать их запросы параллельно. Мы не знаем, чего ждать дальше, запроса от уже присоединившегося клиента №1 или №2 или нового соединения. Поэтому на каждое соединение вешаем нить, которая работает с конкретным клиентом. Внутри нити бесконечный цикл получения запросов, из которого выходим, если соединение разорвано.

Непонятно как выключать сервер, ведь в основном теле бесконечный цикл. Пока никак, т.к. приложение консольное, то будет черное окно с рестиком. Им и будем закрывть. Потом будем выключаться по определенному запросу, например при url содержащем "\exit", но это потом.

Итак, все, дальше только код.

 

Авторизуйтесь пожалуйста