我已经了解了 tcp 中两个臭名昭著的错误之间的区别:
[Errno 54] Connection reset by peer[Errno 32] Broken pipe这两个错误都是tcp连接的一侧因未知原因关闭,另一侧仍在与其通信。
write东西,Broken pipe被扔read东西,Connection reset by peer被扔我能够Broken pipe使用下面的 Python 代码进行重现。
# tcp_server.py
def handler(client_sock, addr):
try:
print('new client from %s:%s' % addr)
finally:
client_sock.close() # close current connection directly
if __name__ == '__main__':
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 5500))
sock.listen(5)
while 1:
client_sock, addr = sock.accept()
handler(client_sock, addr)
Run Code Online (Sandbox Code Playgroud)
至于客户,
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> sock.connect(('', …Run Code Online (Sandbox Code Playgroud) 我有一个用 Python 编写的套接字代理,当它从一对通信对等方接收到 RST 时,它将通过让套接字被垃圾收集来关闭与两个对等方的连接。这会导致其他对等方看到 FIN 而不是 RST。
这意味着代理有效地将 RST 转换为 FIN,我认为这并不理想。
我发现在 Linux 中可以通过使用 family 地址调用 connect 来重置 TCP 连接AF_UNSPEC。但我还没有找到从 Python 程序中执行此操作的方法。
如何在 Python 中connect获取地址?AF_UNSPEC
到目前为止我已经尝试过的
我尝试查看help相关connect方法的输出并发现:
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).
Run Code Online (Sandbox Code Playgroud)
不幸的是,这并没有告诉我address为了构建AF_UNSPEC地址必须使用什么参数。
我尝试将原始套接字 fd 包装在一个新的套接字对象中,其族AF_UNSPEC如下:
socket.fromfd(s.fileno(), socket.AF_UNSPEC, 0)
Run Code Online (Sandbox Code Playgroud)
结果对象产生相同的帮助文本,并且任何调用connect新构造的套接字对象的尝试都会导致
socket.error: getsockaddrarg: …Run Code Online (Sandbox Code Playgroud)