Communicating between NodeJS and C using node-ipc and unix sockets

后端 未结 2 608
-上瘾入骨i
-上瘾入骨i 2020-12-09 06:32

I want to communicate between NodeJS and a C program using node-ipc, over a Unix socket, which according to that homepage is the fastest option. (They will be on the same ma

2条回答
  •  执笔经年
    2020-12-09 07:05

    I got it to work in the end with the code below. You can have it for free!

    server.c

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

    On a side note, I've realised that if you just want to do communicate between NodeJS via unix sockets with C, NodeJS actually comes with a module that does that already. Which as it turns out, is what node-ipc uses under the hood. So it might be easier just to use NodeJS's net package instead. This previous question points out how to do IPC in NodeJS. Just combine that with the above C code.

提交回复
热议问题