当前位置: 首页 > 面试题库 >

使用node-ipc和unix套接字在NodeJS和C之间进行通信

蓝夕
2023-03-14
问题内容

我想在Unix套接字上使用node-ipc在NodeJS和C程序之间进行通信,根据该主页,这是最快的选择。(它们将在同一台计算机上)。该软件包声称它可以与C程序通信。(我必须进行健全性检查)。

问题在于示例没有提供示例C代码,而且我几乎不知道如何让他们交谈。

谁能指出我一个C代码示例以匹配那些客户机/服务器示例?例如,我将如何改编本教程以在C中使用unix管道(假设我还没有完全脱离轨道?!也许我想要的是“
domain
sockets

”?)这对我来说都没有任何意义,我缺少一些关键的东西。


问题答案:

最后,我将其与下面的代码一起使用。您可以免费获得它!

服务器

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>

char *socket_path = "/tmp/icp-test";

int main(int argc, char *argv[]) {
  struct sockaddr_un addr;
  char buf[100];
  int fd,cl,rc;

  if (argc > 1) socket_path=argv[1];

  if ( (fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
    perror("socket error");
    exit(-1);
  }

  memset(&addr, 0, sizeof(addr));
  addr.sun_family = AF_UNIX;
  if (*socket_path == '\0') {
    *addr.sun_path = '\0';
    strncpy(addr.sun_path+1, socket_path+1, sizeof(addr.sun_path)-2);
  } else {
    strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path)-1);
    unlink(socket_path);
  }

  if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
    perror("bind error");
    exit(-1);
  }

  if (listen(fd, 5) == -1) {
    perror("listen error");
    exit(-1);
  }

  while (1) {
    if ( (cl = accept(fd, NULL, NULL)) == -1) {
      perror("accept error");
      continue;
    }

    while ( (rc=read(cl,buf,sizeof(buf))) > 0) {
      printf("read %u bytes: %.*s\n", rc, rc, buf);
    }
    if (rc == -1) {
      perror("read");
      exit(-1);
    }
    else if (rc == 0) {
      printf("EOF\n");
      close(cl);
    }
  }
  return 0;
}

client.js:

 var ipc=require('node-ipc');

var socketId = 'icp-test';
ipc.config.id   = 'hello';
ipc.config.socketRoot = '/tmp/';
ipc.config.appspace = '';

ipc.config.retry= 1500;
ipc.connectTo(
  socketId,
  function(){
    ipc.of[socketId].on(
      'connect',
      function(){
        console.log("Connected!!");
        ipc.log('## connected to world ##'.rainbow, ipc.config.delay);
        ipc.of[socketId].emit(
          'message',  //any event or message type your server listens for
          'hello'
        )
      }
    );
    ipc.of[socketId].on(
      'disconnect',
      function(){
        console.log("Disconnected!!");
        ipc.log('disconnected from world'.notice);
      }
    );
    ipc.of[socketId].on(
      'message',  //any event or message type your server listens for
      function(data){
        console.log("Got a message!!");
        ipc.log('got a message from world : '.debug, data);
      }
    );
  }
);

附带说明一下,我已经意识到,如果您只想通过带有C的unix套接字在NodeJS之间进行通信,则NodeJS实际上已经带有一个已经完成该任务的模块。事实证明,这是node-ipc引擎盖下使用的东西。因此,仅使用NodeJS的net包可能会更容易。前面的问题指出了如何在NodeJS中执行IPC。只需将其与上面的C代码结合即可。



 类似资料:
  • 我正在使用一个抽象的Unix套接字在C和Go程序之间传递数据。C程序正在创建套接字,而Go程序连接到套接字。问题是Go程序无法连接到套接字,我收到以下错误消息: 下面是C程序: 和Go程序: 在C程序中,我将套接字名称中的第一个字节设置为空字节,就像Spec一样。根据我在Go中收集的信息,名称需要以开头。 运行我可以看到套接字已创建: 为什么Go程序无法连接到套接字? 编辑2: 我用Go为抽象套接

  • 问题内容: 更具体地说,如果计算机上有服务器(实例),我可以使用C#实例连接到该服务器吗? 问题答案: 主要问题是您需要非常小心发送和接收的数据的编码。这是一对可以协同工作的程序。C#客户端发送字符串,方法是首先发送其长度为整数,然后发送字符串本身的字节。Java服务器读取长度,然后读取消息并将输出打印到控制台。然后编写回显消息,计算其长度,提取字节并将其发送回C#客户端。客户端读取长度,消息并打

  • 问题内容: 我有一些C#代码需要调用Python脚本数千次,每次都传递一个字符串,然后期望返回。可以使用任何版本的Python运行python脚本,因此我不能使用Iron python。建议使用IPC命名管道。我对此没有经验,并且在弄清楚如何在C#和Python之间执行此操作时遇到了麻烦。这是一个简单的过程,还是我正在寻找可观的工作量?这是解决我的问题的最好方法吗? 问题答案: 使用zeromq。

  • 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。 命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。 信号(Signal):信号是比较复杂的通信方式,用于通知接受进

  • 我有2个Docker容器:App 应用程序-包含php应用程序代码的简单容器。它仅用于存储代码并将代码传递到远程Docker主机。 应用映像Dockerfile: Web服务容器,由PHP-FPM Nginx组成。 Web image Dockerfile: 我的问题:是否可以通过套接字链接Web容器和App容器? 主要原因是使用应用程序容器将更新的代码部署到远程Docker主机。使用卷/命名卷在

  • 在nodeJS应用程序中,我希望通过其UNIX套接字。我用这个包裹https://mongodb.github.io/node-mongodb-native/?jmp=docs(版本3.1.6),通过这种方式: 此处的文档中引用了URI:https://docs.mongodb.com/manual/reference/connection-string/#unix-域套接字。但在我的例子中,它失