Передача сокета C / C ++ в EM_ASM для использования в качестве веб-сокета в Emscripten - PullRequest
1 голос
/ 10 мая 2019

В моей программе на c ++ я хотел бы сделать что-то вроде этого

int mySock = socket(...);
EM_ASM_({
        mySock.send("hello");
    },mySock);

Как правильно передать сокет c ++, чтобы я мог использовать его в качестве веб-сокета javascript?

1 Ответ

1 голос
/ 10 мая 2019

Edit:

Сокеты в стиле BSD в Emscripten C / C ++ являются веб-сокетами, так как в WebAssembly отсутствует низкоуровневый сетевой API-интерфейс для браузеров.

Итак, ваша цель - передать сокеты C / C ++ в EM_ASM блок JS. После поиска исходного кода Emscripten я обнаружил, что WS.sockets[id] должно работать :

#include <stdio.h>
#include <emscripten.h>

int mySock = socket(...);

EM_ASM({  // Or MAIN_THREAD_EM_ASM instead.
  var ws = WS.sockets[$0];
  // Play with your socket here...
}, mySock);

Я знаю, что это звучит недокументированным хакерским поведением, но в этот момент вы должны иметь дело с взломами, когда вам нужны низкоуровневые взаимодействия в Emscripten.

Оригинал (это неправильно, игнорировать)

BSD-сокеты в Emscripten C / C ++ являются веб-сокетами из-за отсутствия низкоуровневых сетевых API для браузеров.

Итак, ваша цель - передать сокеты C / C ++ в EM_ASM блок JS. После некоторого поиска я нашел скрытый (недокументированный) API с именем FS.getStream(). Я еще не тестировал его, так как на данный момент у меня нет подходящей тестовой среды, но вы можете попробовать вот так:

#include <stdio.h>
#include <emscripten.h>

int mySock = socket(...);

EM_ASM_({  // Or MAIN_THREAD_EM_ASM instead.
  var stream = FS.getStream($0);
  var data = new Uint8Array(32);
  FS.write(stream, data, 0, data.length, 0);
}, mySock);

Подробнее об API FS (хотя FS.getStream() - один из немногих недокументированных методов) вы можете найти в официальной документации Emscripten .

...