2016-10-03 135 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無關。

相關問題