gpt4 book ai didi

如果客户端停止(SIGSTOP),Python TCP 服务器将永远阻止发送给客户端

转载 作者:太空宇宙 更新时间:2023-11-04 11:53:50 27 4
gpt4 key购买 nike

我在 python 中有一个非常简单的 tcp 服务器,其代码如下:

#!/usr/bin/env python                                                           

import socket

sock = socket.socket()

sock.bind(('',3912))
sock.listen(100)

num_cons = 10
cons = []
for i in range(num_cons):
con, addr = sock.accept()
cons.append(con)

while True:
for con in cons:
msg = "a"* 1000
num_sent = con.send(msg.encode())
print("sent: {} bytes of msg:{}".format(str(num_sent), msg))

对应的客户端代码为

#!/usr/bin/env python                                                           

import socket

sock = socket.socket()

sock.connect(('',3912)) # in reality here I use the IP of the host where
# I run the server since I launch the clients on a different host

while True:
data = sock.recv(1000)
print("received data: {} ".format(str(data)))

现在,如果我用

启动服务器
./server.py

和来自不同主机的 10 个并行客户端:

for i in `seq 1 10`; do ./client.py 2>/dev/null 1>/dev/null & done

然后我将 kill -SIGSTOP %1 发送给第一个客户端,我希望服务器能够成功地继续尝试发送数据,因为它不知道客户端已经停止。相反,服务器在尝试将数据发送到客户端 1 时阻塞。如果客户端与服务器位于同一主机上,我可以理解这种行为:我们尝试写入数据,但内核缓冲区已满,因此我们阻塞服务器,但客户端从不读取,因此永远不会释放缓冲区。然而,如果客户端在不同的机器上,服务器主机的内核缓冲区应该只是暂时充满,然后内核应该通过网卡发送数据并释放它们。那么,为什么我的服务器会阻塞 send 调用?我还没有验证在使用不同的语言(例如 C)时是否会出现相同的行为

最佳答案

这很奇怪,因为 1000 个字符对于 TCP 来说太小了。我没有可用的 Linux 机器,但在 FreeBSD 机器上,我可以在 TCP 连接上成功发送 130000 字节,在发送方阻塞之前,对等方已停止。在 Windows 上超过 1000000。

但由于 TCP 是一种连接协议(protocol),如果由于内部 TCP 堆栈队列已满而无法对其数据进行排队,则 send 调用将被阻塞。

关于如果客户端停止(SIGSTOP),Python TCP 服务器将永远阻止发送给客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55110549/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com