【发布时间】:2017-02-06 23:13:48
【问题描述】:
我正在尝试通过 nodejs 连接到命名的 Unix 域套接字。我已经看到文档似乎支持连接到 Unix 套接字,但是我还没有看到任何通过名称连接到套接字的示例,而不是通过在众所周知的位置访问套接字文件。
我可以清楚地看到我需要连接的套接字是使用 lsof(和一些 grepping)创建的:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
run 5632 user 3u unix 0xffff8803dd4b6000 0t0 29647 @#user#5632#1 type=SEQPACKET
套接字的名称被传递给实际运行我的节点脚本的脚本。我尝试了以下方法:
import net = require('net');
var socket;
var element = "#user#5632#1"; //Parsed from args
try {
socket = net.createConnection("@"+element,(error)=>{
if(error){
console.log(error)
}else{
console.log("Connection Established "+element);}
});
socket.on('error', function(err) {
console.log("Error: " + err);
});
} catch (error) {
console.error(error);
}
显然,我已经完成了这个以在几个地方(在执行的不同点)捕获错误,但关键是 createConnection 正在抛出:
Error: Error: connect ENOENT @#user#5882#1
使用net.connect会导致完全相同的错误。
我测试了在一个众所周知的位置创建一个套接字(文件),并连接到它,它工作得很好,但据我所知,节点,或者至少 net 模块似乎没有支持连接到临时套接字。
任何人都知道是否有办法做到这一点,或者我是否需要以不同的方式格式化我的套接字名称以便连接或真的有任何帮助?
【问题讨论】:
-
我不太确定,但我认为如果要连接或创建抽象命名空间 unix 域套接字,则需要在名称前添加
\0。 man UNIX(7):(abstract: an abstract socket address is distinguished (from a pathname socket) by the fact that sun_path[0] is a null byte ('\0')) 因此,如果您使用\0#user#5632#1或\0@#user#5632#1,它可能会起作用。但我自己从未尝试过。 -
@t.niese 这至少将错误从找不到套接字更改为无法连接到套接字,但是,Node 似乎不支持这种套接字类型。还是谢谢!
标签: javascript node.js unix-socket