具有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'事件,也不会发生任何其他事件或数据。