Блог им. elektroyar

С++ Библиотека для сервера и клиента Named Pipe

В общем, сделал библиотеку simple-named-pipe-server для  работы с именованными каналами. Библиотека содержит сервер и клиент для C++11, а также клиент для MQL4.

С++ Библиотека для сервера и клиента Named Pipe


Очень простая, многопоточная серверная и клиентская библиотека Named Pipe, реализованная с использованием C++11. Проект был проверен на компиляторе mingw 7.3.0 x64. Папка code_blocks содержит примеры для IDE Code::Blocks. Не забудьте в проектах указать свой компилятор, иначе проект не соберется. Сделал либу только сегодня, так что в ней могут быть ошибочки.

Пример сервера
#include <iostream>
#include "named-pipe-server.hpp"

int main() {
    /* в конструкторе сервера можно также задать размер буфера */
    SimpleNamedPipe::NamedPipeServer server("my_server");

    /* обработчики событий */
    server.on_open = [&](SimpleNamedPipe::NamedPipeServer::Connection* connection) {
        std::cout << "open, handle: " << connection->get_handle() << std::endl;
    };
    server.on_message = [&](SimpleNamedPipe::NamedPipeServer::Connection* connection, 
			const std::string &in_message) {
        /* обрабатываем входящие сообщения */
        std::cout << "message " << in_message << ", handle: " << connection->get_handle() << std::endl;
        connection->send("ok");
    };
    server.on_close = [&](SimpleNamedPipe::NamedPipeServer::Connection* connection) {
        std::cout << "close, handle: " << connection->get_handle() << std::endl;
    };
    server.on_error = [&](SimpleNamedPipe::NamedPipeServer::Connection* connection, const std::error_code &ec) {
        std::cout << "error, handle: " << connection->get_handle() << ", what " << ec.value() << std::endl;
    };

    /* запускаем сервер */
    server.start();
    std::system("pause");

    /* останавливаем сервер 
     * (деструктор класса сам выполнит остановку, вызывать не обязательно)
     */
    server.stop();
    std::cout << "close program" << std::endl;
    return EXIT_SUCCESS;
}
Пример клиента

#include <iostream>
#include "named-pipe-client.hpp"

using namespace std;

int main() {
	/* в конструкторе клиента можно также задать размер буфера */
	SimpleNamedPipe::NamedPipeClient client("my_server");
	
	/* обработчики событий */
	client.on_open = [&]() {
		std::cout << "open, handle: " << client.get_handle() << std::endl;
		client.send("Hello!");
	};
	client.on_message = [&](const std::string &in_message) {
		std::cout << "message " << in_message << ", handle: " << client.get_handle() << std::endl;
		client.send("ok");
		//client.close(); // можно закрыть соединение
	};
	client.on_close = [&]() {
		std::cout << "close, handle: " << client.get_handle() << std::endl;
	};
	client.on_error = [&](const std::error_code &ec) {
		std::cout << "error, handle: " << client.get_handle() << ", what " << ec.value() << std::endl;
	};

	/* запускаем клиент */
	client.start();
	
	std::system("pause");
	std::cout << "close program" << std::endl;
        return EXIT_SUCCESS;
}

Пример клиента для MQL

#include <named_pipe_client.mqh>
NamedPipeClient pipe;

int OnInit() {
   while(!pipe.open("my_server")) {
      Print("Канал не создан, повтор через 1 секунду...");
      Sleep(1000);
   }
   uint start=GetTickCount();
   pipe.write("ping");
   uint stop=GetTickCount();
   Print("Пересылка заняла"+IntegerToString(stop-start)+" [ms]");
   while(pipe.get_bytes_read() == 0) {
      Sleep(1);
   }
   Print("Получено сообщение: ",pipe.read());
   return(INIT_SUCCEEDED);
}

Лирика

Зачем это все нужно? Может пригодиться для связки программы и Метатрейдера, к примеру. Данная либа будет использована в проекте open bo bot.
Больше технической и трейдерской ереси вы найдете на моем канале где я ну типа пытаюсь по научному торговать, ну вы поняли, подгоняю короч коэффициенты на истории аля как мамкин датасаентист. Да, еще я начал торговать бинарками. Ужос. Через пару месяцев посмотрим, что выйдет. Если будет гуд, пойду на риули рыночек зашибать бабосы на светлое будущее человечества. А если не выйдет, стану инфоциганом пойду на работу или стану бомжом займусь чем нибудь другим.
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
1.9К | ★1
2 комментария

Лайк за старания.

Но для подавляющего большинства программирование — это сложно.

Тем более на C++.

avatar
Интереснее было бы с Qlua связку
avatar

Читайте на SMART-LAB:
Курс евро умеренно негативно отреагировал на решение ЕЦБ по процентным ставкам
Европейский центробанк 23 июля не стал рисковать и принял ожидаемое решение сохранить все ключевые процентные ставки без изменений. Так, базовая...
Фото
Недолгая радость. Каким будет эффект от решений ЦБ для рынка и экономики
Пятничное решение Банка России не разочаровало инвесторов и даже ненадолго улучшило настроения на рынке. ЦБ снизил ставку на 0,25 п.п., до...
Инвестиции без спешки: торгуем в выходные
Алексей Девятов Клиенты Альфа-Инвестиций могут совершать сделки в выходные . Торги в эти дни не отличаются волатильностью, но если всё-таки...
Фото
РУСАГРО: возвращение дивидендов и неизбежных иксов
РУСАГРО помимо хорошего операционно отчета, выпустила долгожданный (хотя и невероятный) сущфакт «С учетом установленных Определением...

теги блога elektroyar

....все тэги



UPDONW
Новый дизайн