【问题标题】:Firefox shows connection reset error when server closes connectionFirefox 在服务器关闭连接时显示连接重置错误
【发布时间】:2021-09-18 13:44:49
【问题描述】:

我创建了一个简单的 python 服务器,它将接收到的所有内容发回。

我想知道是否可以在将数据发送到客户端(网络浏览器)后立即关闭连接,然后客户端显示它收到的数据。目前,客户端显示连接已重置

谢谢

#!/user/bin/env python3
import socket

HOST = 'localhost'  # loopback interface address 
PORT = 3000         # non-privileged ports are > 1023

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    while True:
        # connect to the next client in queue
        conn, addr = s.accept()
        with conn:
            print('Connected by', addr)
            data = conn.recv(1024).decode()
            print(data)
            conn.sendall(data.encode())

【问题讨论】:

  • 可以,发送数据给客户端后可以立即关闭连接。
  • @PresidentJamesK.Polk 服务器可以关闭连接,但客户端显示连接已重置,而不是显示响应。
  • 那么客户端有问题,但是我这里没有看到任何客户端代码。
  • 当然,客户端和服务器都必须遵循相同的协议。如果你不这样做,一方或双方都会报错,就像这里发生的一样。 HTTP 是一个复杂的协议,你的服务器没有做任何远程接近 HTTP 的事情。

标签: python sockets


【解决方案1】:

解决方案

#!/user/bin/env python3
import socket

HOST = 'localhost'  # loopback interface address 
PORT = 3000         # non-privileged ports are > 1023

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    while True:
        # connect to the next client in queue
        conn, addr = s.accept()
        print('Connected by', addr)
        data = conn.recv(1024).decode()
        print(data)
        conn.sendall(data.encode())
        conn.shutdown(socket.SHUT_WR) # changed

说明

该解决方案使用发送FIN 信号的conn.shutdown(socket.SHUT_WR),而不是发送RST 信号的conn.close()

我们不想强制关闭连接。 TCP 设置很昂贵,因此浏览器会要求服务器保持连接以查询资产,在此示例中,浏览器要求style.css

RST 混淆浏览器,Firefox 会显示“连接重置”错误。

FIN 说:“我和你说完了,但我仍然会听你说的一切,直到你说你说完了。”

RST 说:“没有对话。我不会说什么,也不会听你说什么。” 来自FIN vs RST in TCP connections

这是使用shutdown的Wireshark捕获,我们看到3000的服务器和浏览器都承认彼此的FIN

当使用close 时,我们看到

更好的选择是等待客户端启动 4 路终结,通过对服务器进行编程以在客户端发出 FIN 信号时关闭套接字。

四路终结

来自https://www.geeksforgeeks.org/tcp-connection-termination/

【讨论】:

    猜你喜欢
    • 2019-06-29
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多