nodeJs 上的 unix 套接字

Hah*_*ahn 5 javascript unix-socket node.js

快速和基本的 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');
    ...
});
Run Code Online (Sandbox Code Playgroud)

但是我收到连接拒绝错误。我可以理解 c++ 应用程序尚未打开/连接到套接字。我的问题是为什么这很重要?nodeJs服务器不应该等到'connect'事件发出吗?我目前在使用 nodeJs 吗?我错过了什么吗?

Ave*_*ery 8

好的,所以这里有一些误解。让我们从“unix 套接字”的真正含义开始。我认为您认为它只是一个类似文件的项目,它通过操作系统/文件系统自行充当服务器。这并不完全正确。虽然它确实通过文件系统绑定,但它并不是真正的传统文件。相反,它就像一个 TCP/IP 套接字,只不过不是绑定 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();
});
Run Code Online (Sandbox Code Playgroud)

请注意,“普通”套接字和 unix 域套接字之间还有另一个区别:服务器使用完 unix 域套接字后,它不会自动销毁。您必须改为unlink /tmp/unixSocket重用该“地址”/路径