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