【发布时间】:2018-10-11 08:37:58
【问题描述】:
这个问题来自以下:
Communicating between NodeJS and C using node-ipc and unix sockets
关于已接受的解决方案 (https://stackoverflow.com/a/39848936/1834057),我想知道是否有人能够准确说明如何将数据从 C 发送到 Node.js。该解决方案演示了从 Node.js 向 C 发送数据,但不反向。我有一个需要双向通信的应用程序,因此缺少的组件对我来说至关重要。
我对 unix 套接字的理解是 write、send 或 sendmsg 之一应该能够完成这项工作,但是,我没有任何运气。如果这个理解有误,请指教。
为了让一个简单的示例运行,假设在 C 代码中读取一条消息时,让我们发回一条消息并尝试在节点服务器上触发 ipc.of[socketId].on('message',...) 事件。
这意味着我正在尝试改变它:
while ( (rc=read(cl,buf,sizeof(buf))) > 0) {
printf("read %u bytes: %.*s\n", rc, rc, buf);
}
进入这个:
while ( (rc=read(cl,buf,sizeof(buf)) ) > 0) {
printf("read %u bytes: %.*s\n", rc, rc, buf);
//Respond to the node server
int n;
char * msg = "{\"type\":\"message\",\"data\":\"hello response\"}\t";
if((n = write(fd,msg,sizeof(msg))) < 0){
printf("send failed\n");
}else{
printf("sent %d bytes\n", n);
}
}
这意味着完整的 server.c 代码现在变为:
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <string.h> //Missing from original server.c
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);
//Respond to the node server
int n;
char * msg = "{\"type\":\"message\",\"data\":\"hello response\"}\t";
if((n = write(fd,msg,sizeof(msg))) < 0){
printf("send failed\n");
}else{
printf("sent %d bytes\n", n);
}
}
if (rc == -1) {
perror("read");
exit(-1);
}
else if (rc == 0) {
printf("EOF\n");
close(cl);
}
}
return 0;
}
现在不幸的是,我的写消息返回代码-1,并且没有被 node.js 服务器接收。
client.js 代码保持不变,与原始问题中提供的一样。
有人可以澄清我做错了什么吗?
【问题讨论】:
标签: node.js unix-socket node-ipc