我有一个用Python编写的套接字代理,当它从一对通信对中收到RST时,将通过使套接字被垃圾回收来关闭两个对等体之间的连接。这导致另一个对等体看到了FIN而不是RST。
这意味着代理有效地将RST转换为FIN,我认为这并不理想。
我发现在Linux中可以通过使用地址族AF_UNSPEC调用connect来重置TCP连接。但我还没有找到从Python程序中执行此操作的方法。
如何在Python中连接到AF_UNSPEC地址?
到目前为止我尝试过查看相关
很遗憾,这并没有告诉我构建
我尝试用家族为
这意味着代理有效地将RST转换为FIN,我认为这并不理想。
我发现在Linux中可以通过使用地址族AF_UNSPEC调用connect来重置TCP连接。但我还没有找到从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).
很遗憾,这并没有告诉我构建
AF_UNSPEC
地址时address
参数需要是什么。我尝试用家族为
AF_UNSPEC
的新套接字对象包装原始套接字fd,如下所示:socket.fromfd(s.fileno(), socket.AF_UNSPEC, 0)
生成的对象产生相同的帮助文本,任何尝试在新构建的套接字对象上调用connect
的操作都会产生...
socket.error: getsockaddrarg: bad family
所以看起来使用socket.fromfd
可能不是我问题的答案。
TypeError: listen() takes exactly one argument (0 given)
和NameError: name 'struct' is not defined
。一旦我修复了这些问题,我发现如果套接字上有尚未读取的数据,则会产生 RST,否则会产生 FIN。这与我没有使用SO_LINGER
时看到的完全相同的行为。因此,似乎你收到 RST 的原因是curl
发送了一个请求,但服务器没有读取它。但是当我想要产生 RST 时,我无法强制对等方向我发送更多数据。 - kasperdstruct
导入并修复了SO_LINGER
选项值。启用延迟和零超时后,在两种情况下我都会收到RST。请注意,自Python 3.5以来,listen()
的参数是可选的。 - maxschlepzig