2016-10-03 2 views
4

Ich möchte zwischen NodeJS und einem C-Programm mit node-ipc, über eine Unix-Buchse, die nach dieser Homepage die schnellste Option ist. (Sie werden auf der gleichen Maschine sein). Dieses Paket behauptet, es könnte mit einem C-Programm kommunizieren. (Ich musste überprüfen).Kommunikation zwischen NodeJS und C mit Node-IPC-und Unix-Sockets

Das Problem ist the examples geben Sie nicht Beispiel C-Code, und ich habe fast keine Ahnung, wie ich sie dazu bringen würde zu sprechen.

Kann mir jemand auf ein Beispiel von C-Code verweisen, um diesen Client/Server-Beispielen zu entsprechen? Zum Beispiel: how would I adapt this tutorial on working with unix pipes in C (Angenommen, ich bin nicht komplett von der Spur entfernt? Vielleicht ist es "domain sockets", die ich stattdessen möchte?) Nichts davon macht Sinn für mich, ich vermisse etwas Entscheidendes.

+0

Versuchen Sie, die Programme in beide Richtungen zu kommunizieren? Ist das ein kommerzielles Projekt? Würdest du für Hilfe bezahlen? –

+0

Ja, beide Richtungen. Hilfe zu zahlen ist nicht wirklich eine Option, ich brauche nur einen Anstoß in die richtige Richtung. Ich würde ZeroMQ verwenden, aber es scheint wie totaler Overkill – Jodes

+1

Wenn es auf einem POSIX-System ist, ist es eine sehr einfache Aufgabe in der Tat. Leider kann ich dir nicht umsonst helfen oder hier antworten, da ich denke, dass du mehr als nur Hilfe brauchst. Unix Domain Sockets ist der Weg zu gehen, und ich bin mir sicher, wenn Sie es richtig googeln finden Sie viele Beispiele mit C-Code enthalten. Und es ist in der Tat eine sehr einfache Sache, genau wie eine normale Steckdose, aber mit einer anderen Adresse und einem anderen Typ. –

Antwort

5

Ich habe es am Ende mit dem Code unten arbeiten. Du kannst es kostenlos haben!

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

Auf einer Seite zur Kenntnis, habe ich erkannt, dass, wenn Sie wollen einfach nur zwischen NodeJS kommunizieren über Unix-Sockets mit C kommt NodeJS eigentlich mit a module that does that already. Was sich herausstellt, ist, was node-ipc unter der Haube verwendet. Es könnte also einfacher sein, stattdessen das net-Paket von NodeJS zu verwenden. This previous question points out how to do IPC in NodeJS. Kombinieren Sie das einfach mit dem obigen C-Code.

+0

'' #include '' zu einige Warnungen Squelch – kmiklas

+0

@Jodes - das ist wirklich hilfreich! Wie haben Sie die Zwei-Wege-Kommunikation erreicht? Wie übermittelst du Daten vom c Server zum Client? Außerdem ist es mein Ziel, Express auf dem Client zu verwenden, so dass es Anfragen erhält und irgendwann etwas Arbeit an den c-Server übergibt. Haben Sie eine Idee, ob die Anfragen Namespaced werden oder brauche ich Threads? –

2

Ich denke, dass Sie nach C-Unix-Domain-Sockets suchen sollten, nicht Pipes. Rohre sind anders. Suchen Sie nach einigen C-Code-Beispielen bei Google mit Unix-Domain-Sockets, probieren Sie einige aus, holen Sie sich das und gehen Sie dann zurück zum Knoten-ipc-Zeug.

Ich habe die Knoten node-ipc und node.js deaktiviert, weil Node nicht relevant ist, wenn Sie zuerst versuchen, die C-Seite herauszufinden.

Verwandte Themen