如何在Node.js中强制重置套接字?

ni65a41a  于 2023-03-17  发布在  Node.js
关注(0)|答案(2)|浏览(158)

我从我的Node.js应用程序收到“read ECONNRESET”错误(可能是客户端或服务器连接,我不确定)。
作为修复这些问题的一部分,我想做一些本地测试,最好是设置自动测试。我想写一个节点客户端和服务器,一旦建立连接就硬重置连接,这样我就可以测试这个。
设置服务器/客户端很简单,但我不知道如何强制重置连接以重现我在这里看到的问题。
有什么想法吗?

eh57zj3b

eh57zj3b1#

更新2023

链接的问题已合并。现在可以使用socket.resetAndDestroy()发送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.resetAndDestroy(), 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进行测试,因为它可以直接控制这个过程。

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),但与此同时,上述内容可能会有所帮助。

myzjeezk

myzjeezk2#

与公认的答案相似,但可能更直接:

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开始

相关问题