你能在node.js中的另一个unix域套接字上发送一个unix域文件描述符吗?

时间:2014-04-19 16:34:59

标签: node.js sockets

在Node.js. 是否可以通过已建立的unix域套接字发送unix域套接字文件描述符?

我有以下示例,但我不确定如何以及是否可以在另一端以可用的形式接收文件描述符。

当前在服务器端获取文件描述符类型错误

在示例中,我让客户端通过unix socket连接到服务器端并且工作正常,然后一旦建立连接,我尝试使用新的unix套接字创建一个新服务器并将该文件描述符传递给服务器,以便服务器可以使用它。

服务器端:

var net = require('net');
var socket = '/tmp/testing.node.sock';
var fs = require('fs');

if (fs.existsSync(socket)) {
    fs.unlinkSync(socket);
}


var server = net.createServer(function(c) { 
    console.log('server connected');
    c.on('end', function() {
        console.log('server disconnected');
    });
    c.on('error', function(e) {
        console.log(e);
    });

    c.on('data', function(data) {
        console.log("data received");
        console.log(data.toString());

        // creating new socket with passed fd
        var newsock = new net.Socket({fd:data}); // how do I convert it here to file descriptor - if even possible 
        console.log(newsock);
    });
});



server.listen(socket, function() { 
    console.log('server bound');


});

客户方:

var net = require('net');
var socket = '/host/testing.node.sock';
var fs = require('fs');

client = net.connect({path: socket}, function () {

    // here we create a new server that we want the fd passed to other server
    var newSock = '/tmp/testing.node.sock';
    if (fs.existsSync(newSock)) {
        fs.unlinkSync(newSock);
    }
    // create a new server 
    var server = net.createServer(function (c) { //'connection' listener
        console.log('server connected');
        c.on('end', function () {
            console.log('server disconnected');
        });
        c.on('error', function (e) {
            console.log(e);
        });

        c.on('data', function (data) {
            console.log("data received");
            console.log(data);
        });

    });


    server.listen(newSock, function () { //'listening' listener
        console.log('server bound');

        console.log(server);

        // here we want to pass the new fd 
        client.write(new Buffer(server._handle.fd));
    });


});

谢谢

2 个答案:

答案 0 :(得分:2)

返回节点v0.4,sendingreceiving都存在此功能,但后来删除了该功能。您必须编写自己的绑定,以允许您在现有fd(您的unix域套接字,其节点可在节点IIRC中访问)上发送/接收文件描述符。 Here are some链接可帮助您入门。

答案 1 :(得分:0)

https://github.com/nodejs/help/issues/345中所述, Node不再支持此功能,因为在Windows上无法做到这一点。但是,此软件包提供了可以发送文件描述符的UNIX套接字API:https://www.npmjs.com/package/usocket