C语言的DDP服务器

A DDP server in C

我们正在用 C 语言开发 DDP 服务器(不要问为什么 - 我们只是需要)。我们注意到 Meteor 使用 SockJS 来实现它的 DDP 协议。虽然有些库允许我在 C 中执行 Web 套接字,但我还没有找到任何适用于 C 的 SockJS 库。

SockJS 库似乎非常庞大,并且由于没有关于其操作方式的规范,因此尝试逆向工程其技巧听起来像是一种非常脆弱的方法。

这让我想知道让我们支持 DDP 的最佳策略是什么。我能想到的选项很少:

  1. 我可以导入 V8 引擎并使用它在 C++ 和 JavaScript 实现之间架起桥梁(然后我可以相对容易地暴露给 C)
  2. 我可以将 SockJS 库 X 用于语言 Y 并使用 Python/C / JNI / ... 与之交互
  3. 也许我可以强制 Meteor 仅使用网络套接字(DDP 文档似乎表明这是可能的,但我不知道如何实现)。

选项 3,如果可能的话,将是最省力的,但会继承 WebSockets 的问题(浏览器互操作性、企业防火墙等)。

选项 1 和 2 是可行的,但我觉得我必须包含的库的大小与我将使用的功能不成比例。

综上所述,似乎没有完美的解决方案。但是我想验证上述选项的可行性,并知道我是否遗漏了什么。另外,如果有人以前试过这个,我很想听听。

我们最终决定实现 SockJS 协议的一个子集 (http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html) in C, using the Mongoose HTTP sserver (http://www.github.com/cesanta/mongoose)。

SockJS中与服务器协商验证web sockets是否可用的部分很容易实现。此外,SockJS 协议将 Web 套接字包包装在自己的 header 中,并使用定期心跳进行活跃度检查。

通过响应 sockjs/info 请求完成协商。以下响应确保 SockJS 使用 Web 套接字协议:

{"websocket":true,"origins":["*x:*"],"cookie_needed":false,"entropy":4271558656}

下面的屏幕截图显示了到目前为止使用我们的 SockJsServer 和 DDPServer 实现的网络套接字流量:

我用 C++ 实现了一个开源 DDP 服务器库,用于处理协议细节。它应该与一些现有的 websocket 库一起使用,例如 mongoose、websocketpp、libwebsockets 等

例如从 MeteorJs 站点调用 C++ 方法如下所示:

也支持从 C++ 获取实时数据。

更多信息和示例 - 关于 GitHub: