相关疑难解决方法(0)

如何重现“对等方重置连接”

我已经了解了 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 sockets networking network-programming tcp

5
推荐指数
1
解决办法
3265
查看次数

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

我有一个用 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)

python sockets linux tcp

5
推荐指数
1
解决办法
8970
查看次数

标签 统计

python ×2

sockets ×2

tcp ×2

linux ×1

network-programming ×1

networking ×1