2014-07-08 2 views
1

저는 간단한 비동기 HTTP 프록시를 만들고 있습니다. 나는 (내가 수신 된 데이터의 특정 크기를 알 수 없기 때문에) 모든 데이터를 수신하기 위해이 기능을 썼다recv()가 동일한 데이터를 계속 반환합니다.

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 moved permanently ..."). 이것은 recv()의 아주 이상한 행동입니다. 아마 이것은 소켓에서 모든 데이터를받는 가장 좋은 방법은 아니지만이 동작에 대한 설명은 생각할 수 없습니다.

답변

2

다음 행 :

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

가 변경되어야 그렇지

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

대신 단지 수신 된 데이터의 축적 된 데이터를 확인한다; 어떤 데이터가 수신되면 무한 루프가 발생합니다.