节点和C应用程序之间的进程间通信

Posted

技术标签:

【中文标题】节点和C应用程序之间的进程间通信【英文标题】:Inter-process communication between node and C application 【发布时间】:2013-05-27 20:01:25 【问题描述】:

我有 2 个软件组件想互相交流,

    node.js 网络应用程序 用 C 编写的专用服务器(一段相当简单的代码,处理一些我不想为其他语言包装的晦涩库)

我想要的对话很简单,

节点:设置资源 ID A C 应用程序:好的,这是引用编号

节点:删除此参考 C 应用程序:当然,伙计。

有什么方法可以轻松地在两者之间传递消息吗?

我目前的理论想法是这样的:

    在 2 个进程之间有 1 个 tcp/unix 套接字,1 个会话只是为了避免一直打开和关闭会话(也担心一次会太多)。 每个匹配的节点请求和 C 应用程序响应都具有相同的 ID(单个 tcp 会话上的 tcp-esque 会话) 每个相关节点请求都会向 C 应用程序生成消息,将响应对象存储在以会话 ID 作为键的某个哈希中。 有一个单节点线程来收集 C 应用程序回复,通过会话 id 查找响应对象并响应客户端

是不是非常低效?

node 中真的有线程支持吗? (一个简短的谷歌并没有带来任何具体的结果)

【问题讨论】:

节点是单线程的。但是,您可以同时运行多个进程。 你的计划听起来不错,我认为 使用消息队列(ZeroMQ、RabbitMQ 等),我不知道你为什么认为你需要多线程,因为 Node 中的套接字几乎总是非阻塞的。 不同节点进程可以共享同一个对象吗? @DimaK:不,他们不能。 【参考方案1】:

基本上你的方向是正确的,你需要某种进程间通信。这真的取决于您的 IPC 有多复杂。如果只是调用一些方法并在方法之间共享简单的(即整数、字符串)数据,那么您可以使用 unix 套接字,它相当容易实现并且由 nodejs 本机支持,并且很容易从 C 中使用好吧(因为所需的标头几乎总是可用的)

ZeroMQ 为您提供传输抽象(允许 IPC 或真正的基于网络的传输)和大量绑定,即使是晦涩难懂的语言。提供的 C 和 Node 示例应该让您立即开始。但是,您需要相应的头文件和库;很可能需要先构建。

如果您要在程序之间交换的数据变得更加复杂(读取结构或数组、嵌套对象),那么您将需要一些真正的 RPC 实现。那里有一堆 RPC 实现;功能方面的 Apache Thrift 对我来说看起来很有希望,尽管最终我无法在合理的时间内构建 thrift 编译器。

所以最后,对我来说,有一个非常相似的用例,我最终使用 ZeroMQ 作为传输抽象,并在此之上使用 JSON-RPC 作为 RPC 机制。 JSON-RPC 非常适合 nodejs 和 C 我使用 https://github.com/pijyoi/jsonrpc ,它建立在 ZeroMQ 和 Jansson 之上。文档是不存在的,但如果你走到那一步,你不应该害怕。

在性能方面,我认为这不会成为问题;您的用例听起来不像,就像您在短时间内有很多请求一样。由于 ZeroMQ 还提供传统的 IPC 作为传输,您也可以使用它来提高性能。

【讨论】:

以上是关于节点和C应用程序之间的进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中的进程间通信中传递结构

在 C 中为多个进程之间的进程间通信创建管道

如何处理两个进程之间的进程间通信?

VC++ 进程间的通信

进程间通信的问题(C++高手进)

MFC 和 WPF 之间的进程间通信