【问题标题】:Can you send a unix domain file descriptor over another unix domain socket in node.js?您可以通过 node.js 中的另一个 unix 域套接字发送 unix 域文件描述符吗?
【发布时间】:2014-06-04 01:18:39
【问题描述】:

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

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

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

在示例中,我让客户端通过 unix 套接字连接到服务器端并且工作正常,然后一旦建立连接,我尝试使用新的 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));
    });


});

谢谢

【问题讨论】:

    标签: node.js sockets


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-05-28
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        相关资源
        最近更新 更多