2015-09-22 36 views
1

具有TLSSocket和tls.connect的Node中的奇怪行爲。節點4.1.0 TLSSocket問題

var port = 7000; 
var host = '94.125.182.252'; //freenode 
var tls = require('tls'); 
var net = require('net'); 

var socket = new net.Socket(); 
var secure; 

secure = new tls.TLSSocket(socket, { 
    isServer: false, 
    rejectUnauthorized: false 
}); 

// edit (left out of original post, but present in my test code, whoops) 
secure.connect({ 
    port: port, 
    host: host 
}); 

secure.setEncoding('utf8'); 

secure.on('connect' , function() { 
    console.log('connected'); 
}) 

.on('secureConnect', function() { 
    console.log('secure connect'); 
}) 

.on('error', function(e) { 
    console.log('error', e); 
}) 

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

if (secure.isPaused()) { 
    console.log('socket was paused'); 
    secure.resume(); 
} 

這甚至不嘗試連接並且不會產生錯誤消息。我有wireshark監控,並沒有捕獲活動。

一種不同的方法:

secure = tls.connect({ 
    rejectUnauthorized: false, 
    host: host, 
    port: port, 
    socket: socket 
}); 

同樣的故事,沒有捕捉到,沒有錯誤。如果我刪除上面socket: socket方面它將連接。這是有道理的,因爲文檔聲明如果指定套接字選項,它將忽略端口和主機。上述工作在我以前的Node版本(0.12.7)上。

如果我想使用現有的套接字,我必須告訴它在連接tls.connect之前進行連接。

socket.connect({ 
    port: port, 
    host: host 
}); 

secure = tls.connect({ 
    rejectUnauthorized: false, 
    socket: socket 
}); 

這似乎並不合適。 將連接套接字傳遞給tls.TLSSocket(套接字,...)似乎沒有效果。 「連接」事件被解僱,但我想這與TLSSocket無關。 我無法使tls.TLSSocket(...)在之前的節點迭代上工作。 單步執行節點調試沒有發現任何明顯的問題。

net.Socket([options])的選項似乎不接受配置的端口或主機,直到您嘗試連接,並且在傳遞給tls.connect之前嘗試連接似乎違反直覺。這表明這不是預期的用法。

所以我的問題是:

我在做什麼毛病tls.TLSSocket()或許是一個錯誤嗎?

我正確地認爲,將現有套接字傳遞到tls.connect()是爲了建立連接切換協議嗎?如果不是,分配端口和主機的正確方法是什麼?

編輯:

按照建議:

secure = tls.connect({ 
    rejectUnauthorized: false, 
    socket: socket 
}); 


socket.connect({ 
    port: port, 
    host: host 
}); 

這工作。

secure = new tls.TLSSocket(socket , { 
    isServer: false, 
    rejectUnauthorized: false 
}); 

socket.connect({ 
    port: port, 
    host: host 
}); 

不幸的是,這是行不通的。發出'連接'事件,絕不會發生'secureConnect'事件,也不會發生任何其他事件或數據。

回答

3

在您的前兩個(非工作)示例中,您只創建了一個套接字並且從未開始實際連接它。在原始代碼的末尾添加一個socket.connect();,它應該可以正常工作。

tls.connect()當傳遞一個普通套接字時,實際上並沒有在內部調用socket.connect();,它只是設置爲開始監聽套接字上的數據,以便它可以正確解密傳入數據。