我从Node.js应用程序收到“读取ECONNRESET”错误(可能是客户端或服务器连接,我不确定)。
作为修复这些问题的一部分,我想做一些本地测试,最好为它设置自动化测试。我想编写一个Node客户端和服务器,以便在建立连接后立即对其进行硬重置,以便对此进行测试。
设置服务器/客户端很容易,但是我不确定如何强制重置连接以重现我在这里看到的问题。节点socket docs不在任何地方提及重置
有什么想法吗?
答案 0 :(得分:0)
据我所知,目前还没有完美的解决方案,但是我找到了两个选择,filed a bug against Node to add proper support。
对于我的问题(启动HTTP请求,然后对套接字进行RST),我找到了两种解决方案:
const net = require('net');
const socket = new net.Socket();
socket.connect(8000, "127.0.0.1", () => {
socket.write(
'GET / HTTP/1.1\n' +
'Host: example.com\n\n'
);
setTimeout(() => socket.destroy(), 0);
});
如果您知道即将在此连接上收到数据包,则可以提前destroy()
套接字。它不会发送RST,但会发送RST以响应将来的数据包。
要执行此操作,您需要在写入消息之后但在响应到达之前竞相销毁套接字。对于本地连接,这尤其棘手-setTimeout(() => socket.destroy(), 0)
是我找到的最可靠的解决方案,但是YMMV肯定不能保证。我希望write()
回调能够更可靠地工作,但似乎没有。
对我来说,我现在回到使用Python进行测试,因为它对此具有直接控制权。要在Python中发送RST数据包,请执行以下操作:
import socket
import time
import struct
TCP_IP = '127.0.0.1'
TCP_PORT = 8000
# Connect to the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
s.connect((TCP_IP, TCP_PORT))
# Start an HTTP request
s.send("GET / HTTP/1.1\r\n\
Host: example.com\r\n\
\r\n")
time.sleep(0.1)
# RST the socket without reading the response
# See https://stackoverflow.com/a/6440364/68051 for context
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0))
s.close()
希望Node小组很快会考虑增加类似的支持(请参阅https://github.com/nodejs/node/issues/27428),但同时上述内容可能会有所帮助。
答案 1 :(得分:0)
类似于已接受的答案,但可能更直接:
const net = require('net');
const client = net.connect(8124, "localhost", () => {
console.log('connected!');
client.destroy(new Error('ECONNRESET'))
});
来自Simulate an ECONNRESET error on a Node.js net.Socket instance