Node.js的“new Socket”是否创建一个Unix文件套接字?

7
我过去几周一直在使用node.js,并需要实现FAST-CGI协议。问题是,当我创建UNIX套接字(通过“new Socket”)时,我需要获取文件名或文件描述符。但是socket.fd为null(默认参数)。
我的问题是:是否“new Socket”创建了操作系统套接字对象文件,如果是,如何获取Socket文件描述符或文件名?
我不确定这是否是我应该创建Socket的方式,但以下是情况:
node:
var net = require(net)
var socket = new net.Socket()
console.log(socket);

{
 bufferSize: 0,
 fd:null,
 type: null,
 allowHalfOpen: false,
 _writeImpl: [Function],
 _readImpl: [Function],
 _shutdownImpl: [Function]
}

是的,没错,直到你实际执行socket.connect()之前,socket.fd才是空的 ;) - usoban
哦……所以实际的系统套接字是在调用connect时创建的。但是当我调用socket.connect('/tmp/file.sock')时,它会给我返回(错误:ENOENT,没有这样的文件或目录)……我应该先创建文件吗?还是我该怎么做? - user961357
是的,你应该这样做。另外,正如我在下面的回答中所指出的那样,在创建新套接字时可以提供FD:new net.Socket({fd : '/tmp/file.sock'})。 - usoban
原来,你只需要指定套接字的现有文件描述符,它应该是一个数字(fd:NaN)...那我该怎么创建文件呢?我应该使用fs.open吗? - user961357
是的,fs.open就是方法。我将代码附加在下面的答案中。在Ubuntu上(使用node 0.4.11)对我有效。 - usoban
非常感谢!!!你救了我很多麻烦!!!再次感谢! - user961357
1个回答

7

当您连接一个 socket 时,socket.fd 不为 null,至少在我的情况下是这样的,请提供一个示例。

请注意,在创建 socket 时,您也可以指定现有的文件描述符

编辑:

var net = require('net'),
    fs = require('fs'),
    sock;

// Create socket file
fs.open('/tmp/node.test.sock', 'w+', function(err, fdesc){
    if (err || !fdesc) {
        throw 'Error: ' + (err || 'No fdesc');
    }

    // Create socket
    sock = new net.Socket({ fd : fdesc });
    console.log(sock);
});

5
不起作用了,它显示“Unsupported fd type: FILE” :( - ccnokes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接