Передача данных из приложения c++ в приложение JavaScript и наоборот

мне понадобилось передавать данные из одного приложения в другое. Оба приложения находятся и выполняются на одном пк. Объем данных в среднем около 5 мб. Соединение должно быть двухсторонним. Можете, пожалуйста, предложить способ передачи данных и какой-нибудь минимально рабочий код.


Ответы (2 шт):

Автор решения: Deniska SosiSka
  • WebSocket - это протокол двухстороннего обмена сообщениями в реальном времени через TCP соединение. (C++, JS)
  • gRPC - это высокопроизводительный открытый фреймворк для построения RPC-приложений. (C++, JS)
  • IPC - это общий термин для описания методов обмена данными между процессами. Этот термин подразумевает множество различных средств, с лёту вот отличая библиотека для ноды (JS), так-же к этому относятся различные брокеры, очереди, записи в базы и файлы
→ Ссылка
Автор решения: Огль

Ответ на вопрос

Через использование WebSocket. Ниже приведен пример кода для подключения программ, но без отправки данных

С++

include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>
#define _WIN32_WINNT  0x501
#pragma comment(lib, "Ws2_32.lib")
using std::cerr;

int main()
{
    setlocale(LC_ALL, "Russian");
    std::cout << "Start\n";

    WSADATA wsaData;
    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (result != 0) {
        std::cout << "WSAStartup failed: " << result << "\n";
        return result;
    }
    struct addrinfo* addr = NULL;
    struct addrinfo hints;
    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;

    result = getaddrinfo("127.0.0.1", "8000", &hints, &addr);
    if (result != 0) {
        std::cout << "getaddrinfo failed: " << result << "\n";
        WSACleanup();
        return 1;
    }
    int listen_socket = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
    if (listen_socket == INVALID_SOCKET) {
        std::cout << "Error at socket: " << WSAGetLastError() << "\n";
        freeaddrinfo(addr);
        WSACleanup();
        return 1;
    }
    result = bind(listen_socket, addr->ai_addr, (int)addr->ai_addrlen);
    if (result == SOCKET_ERROR) {
        std::cout << "bind failed with error: " << WSAGetLastError() << "\n";
        freeaddrinfo(addr);
        closesocket(listen_socket);
        WSACleanup();
        return 1;
    }
    if (listen(listen_socket, SOMAXCONN) == SOCKET_ERROR) {
        std::cout << "listen failed with error: " << WSAGetLastError() << "\n";
        closesocket(listen_socket);
        WSACleanup();
        return 1;
    }
    int client_socket = accept(listen_socket, NULL, NULL);
    std::cout << "Подключение устоновленно";
    if (client_socket == INVALID_SOCKET) {
        std::cout << "accept failed: " << WSAGetLastError() << "\n";
        closesocket(listen_socket);
        WSACleanup();
        return 1;
    }
}

javascript

const connection = new WebSocket("ws://localhost:8000/")
connection.onopen = (event) => {
    console.log("Connection opened");
};
// если возникла ошибка
connection.onerror = (error) => {
    console.log(`WebSocket Error: ${error}`);
};
→ Ссылка