节点4.1.0 TLSSocket问题

在具有TLSSocket和tls.connect的节点中出现奇怪的行为。

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方面,它将连接。 这是有道理的,因为docs指出,如果指定套接字选项,它将忽略端口和主机。 上面的工作在我以前的Node版本(0.12.7)。

如果我想使用现有的套接字,我必须告诉它连接之前调用tls.connect。

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

这似乎不正确。 将连接套接字传递给tls.TLSSocket(套接字,…)似乎没有效果。 “连接”事件被解雇,但我想这是不相关的TLSSocket。 我无法使tls.TLSSocket(…)在之前的Node迭代上工作。 通过节点debugging进行调查并没有发现任何明显的问题。

net.Socket([options])的选项似乎不接受configuration的端口或主机,直到您尝试连接,并且在传递给tls.connect之前尝试连接似乎是违反直觉的。 这将暗示这不是预期的用法。

所以我的问题是:

我在做什么tls.TLSSocket()错误或者它可能是一个错误?

我正确地认为,将现有套接字传递到tls.connect()是为了build立连接切换协议? 如果没有,最好的方式来分配一个端口和主机?

编辑:

根据build议:

 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”,从来没有任何其他的事件或数据。

在你的前两个(非工作)的例子中,你只创build了一个套接字,并没有开始实际连接它。 添加一个socket.connect(); 在你原来的代码结束,它应该工作正常。

tls.connect()传递一个普通套接字时,并不实际调用socket.connect(); 在内部,它只是设置为开始监听套接字上的数据,以便它可以正确解密传入的数据。