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

Posted

技术标签:

【中文标题】使用 node-ipc 和 unix 套接字在 C 和 NodeJS 之间进行通信【英文标题】:Communicating between C and NodeJS using node-ipc and unix sockets 【发布时间】:2018-10-11 08:37:58 【问题描述】:

这个问题来自以下:

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

关于已接受的解决方案 (https://***.com/a/39848936/1834057),我想知道是否有人能够准确说明如何将数据从 C 发送到 Node.js。该解决方案演示了从 Node.js 向 C 发送数据,但不反向。我有一个需要双向通信的应用程序,因此缺少的组件对我来说至关重要。

我对 unix 套接字的理解是 writesendsendmsg 之一应该能够完成这项工作,但是,我没有任何运气。如果这个理解有误,请指教。

为了让一个简单的示例运行,假设在 C 代码中读取一条消息时,让我们发回一条消息并尝试在节点服务器上触发 ipc.of[socketId].on('message',...) 事件。

这意味着我正在尝试改变它:

while ( (rc=read(cl,buf,sizeof(buf))) > 0) 
      printf("read %u bytes: %.*s\n", rc, rc, buf);

进入这个:

while ( (rc=read(cl,buf,sizeof(buf)) ) > 0) 
  printf("read %u bytes: %.*s\n", rc, rc, buf);

  //Respond to the node server
  int n;
  char * msg = "\"type\":\"message\",\"data\":\"hello response\"\t";
  if((n = write(fd,msg,sizeof(msg))) < 0)
      printf("send failed\n");
  else
      printf("sent %d bytes\n", n);
  

这意味着完整的 server.c 代码现在变为:

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <string.h> //Missing from original server.c

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);

      //Respond to the node server
      int n;
      char * msg = "\"type\":\"message\",\"data\":\"hello response\"\t";
      if((n = write(fd,msg,sizeof(msg))) < 0)
          printf("send failed\n");
      else
          printf("sent %d bytes\n", n);
      
    

    if (rc == -1) 
      perror("read");
      exit(-1);
    
    else if (rc == 0) 
      printf("EOF\n");
      close(cl);
    
  
  return 0;

现在不幸的是,我的写消息返回代码-1,并且没有被 node.js 服务器接收。

client.js 代码保持不变,与原始问题中提供的一样。

有人可以澄清我做错了什么吗?

【问题讨论】:

【参考方案1】:

你必须改变

char * msg = "\"type\":\"message\",\"data\":\"hello response\"\t";
if((n = write(fd,msg,sizeof(msg))) < 0)
    printf("send failed\n");
else
    printf("sent %d bytes\n", n);

char * msg = "\"type\":\"message\",\"data\":\"hello response\"\f";
if((n = write(cl,msg,strlen(msg))) < 0)
    printf("send failed\n");
else
    printf("sent %d bytes\n", n);

库正在等待消息末尾的 \f :-)

希望答案还不算晚:-)

【讨论】:

以上是关于使用 node-ipc 和 unix 套接字在 C 和 NodeJS 之间进行通信的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 Unix 套接字在 C 应用程序和 Java 应用程序之间创建通信?

在 Unix 上使用套接字在 C 中发送和接收文件(服务器/客户端)

使用 Unix 域套接字进行电话对话的 IPC 机制

c#中的Unix套接字

一起talk C栗子吧(第一百五十七回:C语言实例--基于AF_UNIX域的数据报套接字通信)

带有 libevent/libev 的 C 或 C++:监视 unix 套接字