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

时间:2013-05-27 20:01:26

标签: c node.js ipc

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

  1. node.js网络应用程序
  2. 用C编写的专用服务器(一段相当简单的代码,处理一些我不想用其他语言包装的模糊库)
  3. 我想要的对话非常简单,

    • 节点:设置资源ID A
    • C app:好的,这是ref num

    • 节点:取下这个参考
    • C app:当然,伙伴。

    是否有任何无痛的方式在2?

    之间传递消息

    我的理论观点目前正是如此:

    1. 在2个进程之间有1个tcp / unix套接字,1个会话只是为了避免一直打开和关闭会话(也担心一次会有太多)。
    2. 每个匹配节点请求和C app响应具有相同的ID(单个tcp会话上的tcp-esque会话)
    3. 每个相关节点请求都会向C app生成消息,将响应对象存储在某个散列中,会话ID为密钥。
    4. 拥有单个节点线程来收集C app回复,按会话ID查找响应对象并回复客户端
    5. 效率非常低吗?

      节点中是否有实际的线程支持? (一个简短的谷歌没有带来任何具体的结果)

1 个答案:

答案 0 :(得分:4)

基本上你是在正确的方向,你需要某种过程间的沟通。这取决于你的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作为传输,您也可以使用它来提高性能。