套接字连接 shutdown() 与 close()

问题描述 投票:0回答:1

在此代码中:

if __name__ == "__main__":
    soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    soc.bind(("127.0.0.1", 4000))

    while True:
        soc.listen(5)
        conn, address = soc.accept()

        data = conn.recv(32)
        print(f"got data: {data}")
        conn.sendall(response.encode())
        conn.shutdown(socket.SHUT_WR)

将 shutdown 替换为 close 时,尝试使用curl

curl http://localhost:4000

回复:

curl: (56) Recv failure: Connection was reset

但是使用关机通常效果很好,我也注意到了 使用 close + time.sleep 或在其后打印,它会正常工作

这种行为的原因是什么?我知道关闭是半关闭,这意味着它可以从连接接收更多数据

但是新的卷曲意味着新的连接,对吧?

sockets
1个回答
0
投票

如果调用 close,即使尚未读取所有数据,也会触发连接重置。在您的情况下,服务器仅从客户端读取 32 个字节,即使请求可能更大。

当使用关闭或延迟关闭(使用睡眠或打印)时,客户端可能已经关闭连接并向服务器发出信号。由于在这种情况下连接关闭是由客户端发起的,因此即使服务器端有未读数据,服务器也不需要重置它。

© www.soinside.com 2019 - 2024. All rights reserved.