我正在研究一个简单的异步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

否则,它将检查累积的数据,而不是刚刚接收到的数据;否则,它将检查累积的数据。如果接收到任何数据,将导致无限循环。

10-04 23:43
查看更多