代码之家  ›  专栏  ›  技术社区  ›  Alexander Mills

确定服务器是否已在unix域套接字的路径上侦听

  •  0
  • Alexander Mills  · 技术社区  · 6 年前

    在node.js版本10上+

    假设我们有一个服务器在路径上侦听(Unix域套接字):

    const server = net.createServer(socket => {
    
    });
    
    const p = path.resolve(process.env.HOME + '/unix.sock');
    server.listen(p);
    

    在运行上述代码之前,是否有方法确定其他服务器是否已在路径p上侦听?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Dushyant Bangal    6 年前

    替代品 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);
    
        });
    
    }
    

    警告: 如果服务器在新连接上触发某些操作,这将触发它。

        2
  •  1
  •   Dushyant Bangal    6 年前

    简单但有点肮脏的方法是尝试使用端口,看看它是否抛出 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