Как использовать nanomsg в приложении скомпилированном с помощью Emscripten? Есть достаточно большой и сложный проект на C, который использует библиотеку nanomsg для работы с сетью. Задача - собрать его с помощью Emscripten в JS. Однако, здесь мы столкнулись с проблемой, в принципе все уже собирается, за исключением вызовов функций из nanomsg. Насколько я понял "порты" nanomsg, которые успешно собирались бы Emscripten отсутствуют. Единственное что удалось найти это модуль nanomsg for node для nodejs. Но как его использовать из C исходников, собираемых Emscripten'ом - пока непонятно. В связи с чем вопрос - был ли у кого-нибудь опыт сборки приложений с помощью Emscripten, которые используют nanomsg? Может быть кто-то писал wrapper C -> nodejs-nanomsg или что-то подобное?
Если свести задачу к упрощенной, то необходимо собрать два примера, использующих nanomsg с помощью Emscripten:Pipeline (A One-Way Pipe)Pub/Sub (Topics & Broadcast)
Как видно, все они используют nn_socket, nn_bind, nn_send и др. функции из nanomsg. Буду признателен за любую помощь.p.s. Ссылки на проекты успешно собирающиеся Emscripten'ом и использующие nanomsg крайне приветствуются.

21 Авг 2019 в 06:24
186 +1
0
Ответы
1

Поскольку nanomsg не предоставляет поддержку для Emscripten, вам придется написать свой собственный wrapper для данной библиотеки, который бы обеспечивал взаимодействие с ней через интерфейс node.js.

Для начала вам нужно создать C/C++ библиотеку, которая будет обращаться к функциям nanomsg, а затем создать node.js модуль, который будет вызывать эти функции через вашу библиотеку.

Ниже приведен пример упрощенного шаблона реализации wrapper'а для вызова функции из node.js:

#include <nan.h>
#include <nanomsg/nn.h>
#include <stdio.h>
NAN_METHOD(Init){
int sock = nn_socket(AF_SP, NN_PUSH);
if(sock < 0) {
return Nan::ThrowError("Error creating socket");
}
info.GetReturnValue().Set(Nan::New(sock));
}
NAN_METHOD(Connect){
int sock = info[0]->Int32Value();
int connect_stat = nn_connect(sock, "tcp://localhost:5555")
if(connect_stat < 0) {
return Nan::ThrowError("Error connecting");
}
}

Далее вам нужно создать bindings.gyp файл для компиляции вашей C/C++ библиотеки. Пример файла:

{
"targets": [
{
"target_name": "nanomsg",
"sources": [ "nanomsg.cpp" ],
"include_dirs": ["<path_to_nanomsg_headers>"],
"libraries": ["<path_to_nanomsg_libraries>"],
"cflags!": [ "-fno-exceptions" ]
}
]
}

Теперь вам нужно создать node.js скрипт, который будет вызывать функции вашего модуля:

const addon = require('./build/Release/nanomsg.node');
const socket = addon.init();
addon.connect(socket);

Это очень упрощенный пример, но он дает представление о том, как можно создать wrapper для вызова функций nanomsg из node.js при сборке с помощью Emscripten. Вам придется доработать код и добавить обработку ошибок, а также другие функции из nanomsg, необходимые вашему проекту.

20 Апр в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 648 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир