将 C/C++ 套接字传递给 EM_ASM 以在 Emscripten 中用作 websocket

Posted

技术标签:

【中文标题】将 C/C++ 套接字传递给 EM_ASM 以在 Emscripten 中用作 websocket【英文标题】:Passing a C/C++ socket into EM_ASM to use as websocket in Emscripten 【发布时间】:2019-05-09 23:35:41 【问题描述】:

在我的 c++ 程序中,我想做这样的事情

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

传递 c++ 套接字以便我可以将其用作 javascript websocket 的正确方法是什么?

【问题讨论】:

其他不熟悉 Emscripten 的读者请注意:Emscripten 显然带有一个使用 websocket 模拟套接字的库。 【参考方案1】:

编辑:

Emscripten C/C++ 中的 BSD 样式套接字是 websocket,因为 WebAssembly 缺少用于浏览器的低级网络 API。

因此,您的目标是将 C/C++ 套接字传递给 EM_ASM JS 块。挖完Emscripten的源码I found that WS.sockets[id] should work:

#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);

我知道这听起来像是没有记录的 hacky 行为,但此时,当您需要 Emscripten 中的一些低级互操作时,您应该处理 hack。

原创(这是错的,忽略)

Emscripten C/C++ 中的 BSD 套接字是 websocket,因为缺少用于浏览器的低级网络 API。

因此,您的目标是将 C/C++ 套接字传递给 EM_ASM JS 块。经过一番搜索I found a hidden (undocumented) API called 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);

有关FS API 的更多信息(尽管FS.getStream() 是少数未记录的方法之一),您可以从the Emscripten official documentation 找到它。

【讨论】:

没有说清楚,但我已经知道我可以将 c++ send() 用于该示例案例,并且 emscripten c++ 在后台使用 websockets,我的示例代码非常简单,仅用于解释目的,这意味着我的问题更复杂,但它简化了解决如何将 c++ 套接字传递到 EM_ASM() 我对此不太确定,但 emscripten 文件系统 API 不依赖于 javascript websockets API 所以我不认为 FS.write(stream, data, 0, data.length, 0); 行会起作用,但无论如何,也许你的意思是 FS.getStream() 是某种黑客,它会神奇地给我 javascript websocket 变量 但如果它真的有效,你知道它下面是如何检索变量的吗,因为FS.getStream() hack 将来可能会停止工作 @porente 很抱歉,但我想我混淆了 Emscripten 的 UNIX 套接字实现 (SOCKFS) 和普通套接字实现。也许我在星期五晚上喝了太多啤酒;)我更新了答案。

以上是关于将 C/C++ 套接字传递给 EM_ASM 以在 Emscripten 中用作 websocket的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UIImage 传递给 phonegap 以在 Image 控件中查看?

Django 如何将自定义变量传递给上下文以在自定义管理模板中使用?

如何将对象作为数据类型传递给选择元素并使其可读以在其他地方使用它?

可以将 Java 数组传递给采用数组的 C/C++ 函数吗?

c/c++,mfc:不将打开的文件/句柄传递给生成的进程

如何将套接字传递给节点中的集群