2016-09-28 95 views
0

我想通過nodejs連接到一個命名的Unix域套接字。我已經看到,這些文檔似乎支持連接到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模塊似乎不支持連接到短暫的插座。

有人知道是否有辦法做到這一點,或者如果我需要格式化我的套接字名稱,以真正連接或任何幫助?

+0

我並不完全確定,但我認爲如果您想要連接或創建到抽象名稱空間unix域套接字,您需要在名稱前添加'\ 0'。 [man UNIX(7):](http://man7.org/linux/man-pages/man7/unix.7.html)('abstract:通過事實區分抽象套接字地址(從路徑名套接字) sun_path [0]是一個空字節('\ 0')')因此,如果您使用'\ 0#user#5632#1'或'\ 0 @#user#5632#1',它可能會工作。但我從來沒有嘗試過。 –

+0

@ t.niese這樣做至少可以將錯誤從找不到套接字變爲不能連接到套接字,但是,看起來Node似乎不支持此套接字類型。不管怎麼說,還是要謝謝你! –

回答

0

節點不支持SEQPACKET套接字。您可以將PR提交給節點問題跟蹤器,作爲添加支持的功能請求和/或您可能需要編寫一個節點插件,讓您連接到SEQPACKET套接字。