Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点4.1.0 TLSSocket问题_Node.js_Sockets - Fatal编程技术网

Node.js 节点4.1.0 TLSSocket问题

Node.js 节点4.1.0 TLSSocket问题,node.js,sockets,Node.js,Sockets,具有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, re

具有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();
}
socket.connect( {
  port: port,
  host: host
});

secure = tls.connect( {
  rejectUnauthorized: false,
  socket: socket
});
这甚至不会尝试连接,也不会产生错误消息。我有wireshark监控,没有捕获到任何活动

另一种方法:

secure = tls.connect( {
  rejectUnauthorized: false,
  host: host,
  port: port,
  socket: socket
});
同样的故事,没有捕获,没有错误。如果我移除
socket:socket上面的
特性,它将连接。这在一定程度上是合理的,因为docs声明,如果指定了socket选项,它将忽略端口和主机。以上内容适用于我以前的节点版本(0.12.7)

如果我想使用现有的套接字,我必须在调用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();
}
socket.connect( {
  port: port,
  host: host
});

secure = tls.connect( {
  rejectUnauthorized: false,
  socket: socket
});
这似乎不合适。 将连接套接字传递给tls.TLSSocket(套接字,…)似乎没有效果。 “connect”事件被触发,但我认为这与TLSSocket无关。 我无法使tls.TLSSocket(…)在以前的节点迭代中工作。 逐步执行节点调试并没有暴露任何明显的问题

net.Socket的选项([options])在您尝试连接之前似乎不接受用于配置的端口或主机,并且在传递到tls.connect之前尝试连接似乎违反直觉。这表明这不是预期用途

所以我的问题是:

tls.TLSSocket()有什么不对的地方,或者可能是一个bug

假设将现有套接字传递到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
});
不幸的是,这不起作用。将发出“连接”事件,而不是“安全连接”,也不会发出任何其他事件或数据。

在前两个(非工作)示例中,您只创建了一个套接字,从未开始实际连接它。添加一个
socket.connect()在原始代码的末尾,它应该可以正常工作

tls.connect()
在内部,它只是设置为开始侦听套接字上的数据,以便正确解密传入数据