2016-10-03 132 views
4

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

问题是the examples不给出示例C代码,我几乎不知道如何让他们说话。

任何人都可以点我一个C代码的例子来匹配那些客户端/服务器的例子吗?例如,how would I adapt this tutorial on working with unix pipes in C(假设我并不完全偏离轨道?!也许它是我想要的“domain sockets”)?这对我来说没有任何意义,我错过了一些至关重要的东西。

+0

您是否试图在两个方向上交流程序?这是一个商业项目吗?你会支付帮助吗? –

+0

是的,两个方向。支付帮助并不是一个真正的选择,我只需要向正确的方向推动。我打算使用ZeroMQ,但它似乎总是过度杀伤 – Jodes

+1

如果它在POSIX系统上,实际上这是一个非常简单的任务。可悲的是,我不能帮你免费,或者在这里回答,因为我认为你需要的不仅仅是简单的帮助。 Unix域套接字是要走的路,我相信,如果你google的权利,你会发现很多与C代码包括的例子。事实上,这是一个非常简单的事情,就像一个普通的套接字,但是地址和类型不同。 –

回答

5

我最终用下面的代码来完成它。你可以免费获得它!

server.c

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

在一个侧面说明,我已经意识到,如果你只想做之间的NodeJS沟通通过与C的unix套接字,NodeJS实际上带有a module that does that already。事实证明,这是node-ipc在引擎盖下使用。因此,使用NodeJS的net包可能会更容易。 This previous question points out how to do IPC in NodeJS.只需将它与上面的C代码结合起来即可。

+0

''#include ''来压制一些警告 – kmiklas

+0

@Jodes - 这真的很有帮助!你是如何实现双向沟通的?你如何将数据从c服务器传递给客户端?此外,我的目标是在客户端上使用快递,以便它可以接收请求并在某个时间将某些工作传递给c服务器。你有任何想法,如果请求将命名空间或我需要线程? –

2

我认为你应该寻找C unix域套接字,而不是管道。管道是不同的。使用unix域套接字在Google上查找一些C代码示例,尝试几次,取得成功,然后返回到node-ipc的东西。

我关闭了node-ipc和node.js标签,因为如果您试图首先计算出C端,则Node无关。

相关问题