我正在开发一个简单的异步 HTTP 代理。 我写了这个函数来接收所有数据(因为我不知道接收数据的具体大小):
def recvall(sock):
data = b""
while True:
r, w, e = select.select([sock], [], [], 1)
if r:
data+= sock.recv(65535)
if not data: # if empty
break
else:
break
return data
这段代码工作正常,但在我的测试过程中,我注意到循环永远不会结束,并且不断一次又一次地接收相同的数据(具体来说,“301 永久移动......”)。 这是 recv() 的非常奇怪的行为。 也许这不是从套接字接收所有数据的最佳方式,但我想不出对此行为的任何解释。
最佳答案
以下几行:
data += sock.recv(65535)
if not data: # if empty
break
应该改变:
chunk = sock.recv(65535)
if not chunk:
break
data += chunk
否则将检查累计数据,而不是刚刚接收到的数据;如果收到任何数据,则会导致无限循环。
关于python - recv() 不断返回相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24623749/