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

问题描述 投票:1回答:1

我从Node.js应用程序收到“读取ECONNRESET”错误(可能是客户端或服务器连接,我不确定)。

作为解决这些问题的一部分,我想做一些本地测试,最好为它设置自动化测试。我想编写一个节点客户端和服务器,它们一旦建立就立即重置连接,这样我就可以测试它。

设置服务器/客户端很简单,但我不确定如何强制重置连接以重现我在这里看到的问题。节点socket docs没有提到任何地方的重置

有任何想法吗?

javascript node.js tcp reset
1个回答
0
投票

据我所知,目前还没有完美的解决方案,但我找到了两个选择,filed a bug against Node to add proper support

对于我的问题(启动HTTP请求,然后RST套接字)我找到了两个解决方案:

Destroy the socket just before receiving a packet

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()回调更可靠地工作,但它似乎没有。

Use another language (i.e. Python)

对我来说,我现在已经回归到使用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),但上述内容可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.