I got it to work in the end with the code below. You can have it for free!
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 == '') {
*addr.sun_path = '';
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
", rc, rc, buf);
}
if (rc == -1) {
perror("read");
exit(-1);
}
else if (rc == 0) {
printf("EOF
");
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);
}
);
}
);
On a side note, I've realised that if you just want to do communicate between NodeJS via unix sockets with C, NodeJS actually comes with a module that does that already. Which as it turns out, is what node-ipc
uses under the hood. So it might be easier just to use NodeJS's net
package instead.
This previous question points out how to do IPC in NodeJS. Just combine that with the above C code.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…