gpt4 book ai didi

python - 如何在 Python 中重置 TCP 套接字?

转载 作者:可可西里 更新时间:2023-11-01 02:34:50 25 4
gpt4 key购买 nike

我有一个用 Python 编写的套接字代理,当它从一对通信对等方接收到 RST 时,将通过让套接字被垃圾收集来关闭与两个对等方的连接。这会导致其他对等方看到 FIN 而不是 RST。

这意味着代理有效地将 RST 转换为 FIN,我认为这并不理想。

我发现在 Linux 中可以 reset a TCP connnection通过使用家庭 AF_UNSPEC 的地址调用连接。但我还没有找到从 Python 程序执行此操作的方法。

如何在 Python 中连接AF_UNSPEC 地址?

到目前为止我尝试了什么

我尝试查看相关connect 方法的help 输出,发现:

Help on built-in function connect:

connect(...)
connect(address)

Connect the socket to a remote address. For IP sockets, the address
is a pair (host, port).

不幸的是,它没有告诉我address 参数必须是什么才能构造AF_UNSPEC 地址。

我试图将原始套接字 fd 包装在一个新的具有 AF_UNSPEC 系列的套接字对象中,如下所示:

socket.fromfd(s.fileno(), socket.AF_UNSPEC, 0)

生成的对象会产生相同的帮助文本,任何对新构造的套接字对象调用 connect 的尝试都会导致

socket.error: getsockaddrarg: bad family

所以看起来使用 socket.fromfd 可能不是我问题的答案。

最佳答案

查看当前的 socketimplementation在 CPython 中,确实没有 pythonic 方式(将套接字连接到 AF_UNSPEC 地址,截至 2019 年 1 月(即连接到 reset the connection on Linux )。

下一个最好的办法是在接受的套接字上设置SO_LINGER 选项(直接或通过继承)。当启用延迟(并设置为零超时)时,关闭套接字会重置连接。

您必须小心地在正确的套接字 API 级别上设置 SO_LINGER 选项,并对选项值使用正确的编码(它是一个结构)。

例子:

import socket
import struct
import time

s = socket.socket(socket.AF_INET6)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
# if we want to inherit this option:
#s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0))
s.bind(('', 2323))
s.listen()
con, addr = s.accept()
con.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0))
time.sleep(1)
con.close()
time.sleep(3)

使用 curl 连接到这个端口:

$ curl localhost:2323
curl: (56) Recv failure: Connection reset by peer

连接到这个端口而不发送任何东西:

$ socat - tcp:localhost:2323

当用例如转储数据包时

$ tshark -i lo -f 'tcp port 2323'

在这两种情况下,最后一个数据包应该是 RST(从服务器发送到客户端)- 例如:

39 9758.478140247    127.0.0.1 → 127.0.0.1    TCP 66 2323 → 34494 [RST, ACK]
Seq=1 Ack=1 Win=43776 Len=0 TSval=2787120418 TSecr=2787119417

关于python - 如何在 Python 中重置 TCP 套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46264404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com