Блог им. elektroyar

Очень простая, многопоточная серверная и клиентская библиотека 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;
}#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);
}
Лайк за старания.
Но для подавляющего большинства программирование — это сложно.
Тем более на C++.