Блог им. 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:
Фото
Что с новым выпуском Арлифт? Отвечаем на главные вопросы инвесторов
Последние недели для рынка высокодоходных облигаций выдались напряженными. Инвесторы внимательнее смотрят на долговую нагрузку эмитентов,...
Фото
Коксующийся уголь подорожал до максимума за два года
Дарья Фёдорова Цены на уголь подскочили с начала августа: австралийский бенчмарк вырос на 28%, до $276 за тонну, цены в Китае, — на 43% до...
Фото
Как рынок отреагирует на решение ЦБ в пятницу: прогноз Т-Инвестиций по акциям, облигациям и рублю
Сейчас инвесторы настроены осторожно. В котировки рынка заложено ожидание по сохранению ключевой ставки неизменной. Таков и консенсус...
Фото
Базис купил компанию Proto. Что это значит для акций?
Что нам известно по этой сделке? ✅Пресс-релиз читаем тут , переписывать не вижу смысла ✅Кого купили, можно посмотреть тут:...

теги блога elektroyar

....все тэги



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