Node.js中的Unix套接字

6

快速而基础的NodeJs问题,我正在使用Unix套接字进行C++应用程序和我的NodeJs服务器之间的服务器间通信,

我编写了以下NodeJs服务器:

var net = require('net');
var unixSocketServer = net.createConnection('/tmp/unixSocket');
unixSocketServer.on('connect',function(){
    console.log('unix server socket connected on /tmp/unixSocket');
    ...
});

然而,我收到了连接被拒绝的错误。 我可以理解C++应用程序还没有打开/连接套接字。 我的问题是: 为什么这很重要?难道Node.js服务器不应该等待“connect”事件被触发吗? 我当前是否在使用Node.js?我有什么遗漏吗?


你是想在Unix套接字上启动一个服务器还是连接到现有的Unix套接字?如果是后者,你是否检查了/tmp/unixSocket的权限?如果是前者,你应该使用net.createServer() - mscdex
我在解决这个问题时遇到了一些困难。我的用例是,用户可以通过NodeJs更改C++应用程序的内部状态。这个NodeJs应该是服务器还是客户端? - CodeHahn
我的Unix套接字之前已经声明过了,我用**fs.unlink(socketpath)**将其删除了。 - CodeHahn
1个回答

13

好的,这里有一些误解。让我们从'Unix套接字'的真正含义开始。我认为您认为它只是一个类似文件的项,通过操作系统/文件系统像服务器一样运行。但实际上并不完全正确。虽然它确实绑定了文件系统,但它并不是一个传统的文件。相反,它就像TCP/IP套接字一样,只是将文件路径绑定而已。

关键点在于它只是一个绑定了不同类型地址的套接字(以及一些额外的能力,但这超出了本文范围)。这意味着需要有某个东西来绑定该套接字!在这种情况下,我们需要一个服务器,就像我们在使用“普通”端口进行通信时一样。如果未将服务器绑定到该路径,则会出现错误,就像连接到没有侦听器的端口时一样。

要在Node中创建Unix域套接字服务器,非常简单:

'use strict';

const net = require('net');
const unixSocketServer = net.createServer();

unixSocketServer.listen('/tmp/unixSocket', () => {
  console.log('now listening');
});

unixSocketServer.on('connection', (s) => {
  console.log('got connection!');
  s.write('hello world');
  s.end();
});

请注意,'普通'套接字和Unix域套接字之间还有一个区别:在服务器完成Unix域套接字后,它不会自动销毁。相反,您必须执行unlink /tmp/unixSocket以便重用那个“地址”/路径


你如何取消链接套接字?文档中没有关于如何执行此操作的信息。编辑:通过删除文件来实现。fs.unlinkSync(ipcPath) - Joakim L. Christiansen
@JoakimL.Christiansen,是的,fs.unlinkSync()是一种方法。在支持Unix套接字的系统上,我在帖子中提到的unlink命令也存在,是另一种方法。 - Avery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接