使用 node-ipc 和 unix 套接字在 NodeJS 和 C 之间进行通信
Communicating between NodeJS and C using node-ipc and unix sockets
我想使用 node-ipc 通过 Unix 套接字在 NodeJS 和 C 程序之间进行通信,根据该主页,这是最快的选择。 (他们将在同一台机器上)。该软件包声称它可以与 C 程序通信。 (我必须进行完整性检查)。
问题是 the examples 没有给出示例 C 代码,我几乎不知道如何让他们交谈。
任何人都可以指出一个 C 代码示例来匹配那些 client/server 示例吗?例如,我想要的 how would I adapt this tutorial on working with unix pipes in C (Assuming I'm not completely off track?! Maybe it's "domain sockets"?)None 这对我来说很有意义,我遗漏了一些重要的东西。
我认为您应该寻找 C unix 域套接字,而不是管道。管道不同。在 Google 上寻找一些带有 unix 域套接字的 C 代码示例,尝试一些,让它工作,然后回到节点 ipc 的东西。
我去掉了 node-ipc 和 node.js 标签,因为如果你想先弄清楚 C 端,Node 是不相关的。
我最终使用下面的代码让它工作。你可以免费拥有它!
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 == '[=10=]') {
*addr.sun_path = '[=10=]';
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);
}
);
}
);
附带一提,我意识到如果您只是想通过 unix 套接字与 C 在 NodeJS 之间进行通信,NodeJS 实际上带有 a module that does that already。事实证明,这就是 node-ipc
在幕后使用的东西。因此,使用 NodeJS 的 net
包可能会更容易。
This previous question points out how to do IPC in NodeJS. 只需将其与上面的 C 代码结合起来即可。
我想使用 node-ipc 通过 Unix 套接字在 NodeJS 和 C 程序之间进行通信,根据该主页,这是最快的选择。 (他们将在同一台机器上)。该软件包声称它可以与 C 程序通信。 (我必须进行完整性检查)。
问题是 the examples 没有给出示例 C 代码,我几乎不知道如何让他们交谈。
任何人都可以指出一个 C 代码示例来匹配那些 client/server 示例吗?例如,我想要的 how would I adapt this tutorial on working with unix pipes in C (Assuming I'm not completely off track?! Maybe it's "domain sockets"?)None 这对我来说很有意义,我遗漏了一些重要的东西。
我认为您应该寻找 C unix 域套接字,而不是管道。管道不同。在 Google 上寻找一些带有 unix 域套接字的 C 代码示例,尝试一些,让它工作,然后回到节点 ipc 的东西。
我去掉了 node-ipc 和 node.js 标签,因为如果你想先弄清楚 C 端,Node 是不相关的。
我最终使用下面的代码让它工作。你可以免费拥有它!
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 == '[=10=]') {
*addr.sun_path = '[=10=]';
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);
}
);
}
);
附带一提,我意识到如果您只是想通过 unix 套接字与 C 在 NodeJS 之间进行通信,NodeJS 实际上带有 a module that does that already。事实证明,这就是 node-ipc
在幕后使用的东西。因此,使用 NodeJS 的 net
包可能会更容易。
This previous question points out how to do IPC in NodeJS. 只需将其与上面的 C 代码结合起来即可。