【问题标题】:recv() keep returning the same datarecv() 不断返回相同的数据
【发布时间】:2014-08-28 17:05:28
【问题描述】:

我正在开发一个简单的异步 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() 的非常奇怪的行为。 可能这不是从套接字接收所有数据的最佳方式,但我想不出对此行为的任何解释。

【问题讨论】:

    标签: python sockets select python-3.x recv


    【解决方案1】:

    以下几行:

    data += sock.recv(65535)
    if not data: # if empty
        break 
    

    应该改变:

    chunk = sock.recv(65535)
    if not chunk:
        break
    data += chunk
    

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

    【讨论】:

      猜你喜欢
      • 2011-02-13
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 2012-07-02
      • 2015-06-30
      • 2017-02-20
      相关资源
      最近更新 更多