节点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();
在内部,它只是设置为开始监听套接字上的数据,以便它可以正确解密传入的数据。