在Node.js版本10+上
假设我们有一台服务器正在侦听路径(unix域套接字):
const server = net.createServer(socket => {
});
const p = path.resolve(process.env.HOME + '/unix.sock');
server.listen(p);
在运行上面的代码之前,是否可以确定其他服务器是否已经在路径p上进行侦听?
答案 0 :(得分:1)
一种简单但肮脏的方法是尝试使用该端口,并查看它是否引发EADDRINUSE
错误。
function isPortTaken(port, fn) {
var net = require('net')
var tester = net.createServer()
.once('error', function (err) {
if (err.code != 'EADDRINUSE')
fn(true)
})
.once('listening', function () {
tester.once('close', function () {
fn(false)
})
.close()
})
.listen(port)
}
回调将提供布尔值。
我本人要自己编写此脚本,但后来在某个地方找到它并对其进行了很小的更改。您可以在此处找到原始脚本: https://gist.github.com/timoxley/1689041
答案 1 :(得分:1)
my existing answer的替代方法是创建一个客户端并尝试连接到服务器。 根据结果,可以确定是否使用了unix套接字。
function isPortTaken(port, fn) {
var net = require('net');
var client = new net.Socket();
client.connect(port, function(err) {
if(err)
return fn(false)
client.destroy();
fn(true);
});
}
警告:如果服务器在新连接上触发了某些操作,则会触发该操作。