Блог им. 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.8К | ★1
2 комментария

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

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

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

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

Читайте на SMART-LAB:
Технологии как новый драйвер: ключевые идеи инвестиционного форума ВТБ «РОССИЯ ЗОВЕТ!»
🧮 Главный тренд 2026 года — стабилизация и технологический поворот Руководитель департамента по работе с клиентами рыночных отраслей...
ВТБ обещал миноритариям обойтись без допэмиссии
Акции ВТБ в ходе торгов 20 февраля, проходивших на российском рынке в умеренном плюсе, вышли в лидеры роста, подорожав на 3,4%, до 88,42...
Фото
ПКО «Вернём». Зачем облигации при масштабировании бизнеса?
В эфире PRObonds генеральный директор ПКО «Вернём» Павел Ивановский и финансовый директор Роман Гаммель. С ответами на вопросы о новом...
Фото
Россети Центр. Отчет об исполнении инвестпрограммы за Q4 2025г. Ожидаемо снизилась дивидендная база по РСБУ.
Компания Россети Центр опубликовала отчет об исполнении инвестпрограммы за Q4 2025г., где показаны финансовые показатели компании по РСБУ в...

теги блога elektroyar

....все тэги



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