在Node.js中,http.Server
和https.Server
都会发出clientError
事件,但参数不同:
http.Server#clientError(exception, socket)
https.Server#clientError(exception, securePair)
securePair
是tls.SecurePair
,securePair.cleartext
一个tls.CleartextStream
和securePair.encrypted
一个tls.CryptoStream
的实例。
问题是:如何获取导致clientError
的客户端的地址和端口?从理论上讲,这应该有效:
socket = securePair.cleartext.socket;
console.log(socket.remoteAddress + ':' + socket.remotePort);
实际上,当我尝试使用HTTP连接到HTTPS服务器(假装它是一个HTTP服务器)并在几秒钟后取消时,我得到一个类型为clientError
的{{1}},但{ {1}}和ECONNRESET
都是socket.remoteAddress
(即使socket.remotePort
确实是undefined
而不是securePair.cleartext.socket
)。
答案 0 :(得分:2)
不幸的是,赏金似乎并没多大帮助:-(我不得不自己调查一下。
显然,已经修复(但尚未在任何已发布的node.js中),即使在套接字关闭后也能够获取这些值:https://github.com/joyent/node/commit/8c38b07252d86f4eef91344f8df4f0c3e38bca35
解决方法是在连接时存储地址:
srv.on('connect', function (socket) {
socket.stored_remoteAddress = socket.remoteAddress;
});
srv.on('clientError', function (err, socket) {
console.log(socket.cleartext.socket.stored_remoteAddress);
}
这很有效,但并不漂亮。
显然,即使这样也不能完全发挥作用: - (
Node.js 0.11在SSL错误上没有发出'clientError'事件(例如),因此无法捕捉那里的情况。
Node.js 0.12发出'clientError'事件,但使用了一个新的TLS实现,它不再具有'cleartext'套接字。我找不到任何方法将信息从'connect'事件传递给'clientError'事件,或者找出它们是针对同一个套接字的任何方式(因为套接字已在'clientError'事件中关闭)。
所以,似乎唯一的方法就是等待一个新的Node.js版本(最早的0.12.2,如果他们认为这是值得修复的话),并希望这个问题得到修复。