2009-09-21 3 views
0

나는 다운로드가 시작되는 시점에 콘텐츠 길이가 있습니다. 그래서 내가 얼마나 많은 바이트를 요청해야하는지 압니다. 1024 바이트 청크로 다운로드합니다. 마지막 청크에서 남은 바이트 수를 요청합니다. 나는 읽기 기능을 사용하고 있습니다. 하지만 마지막 청크는 도착하는 데 많은 시간이 걸립니다. 정상입니까?HTTP 다운로드의 마지막 청크가 실제로 느린 이유는 무엇입니까?

+1

브라우저와 텔넷이 제대로 처리하지만 클라이언트가 그렇지 않은 경우 관련 코드 스 니펫을 게시하지 마십시오. – Duck

답변

0

감사합니다. 문제를 발견했습니다. 내 코드는 응용 프로그램 수준 버퍼를 사용하므로 마지막 청크는 다운로드하는 데 오랜 시간이 걸립니다. 나는 Bryant의 저서에있는 강력한 io 함수를 사용하고 있습니다. 나는 그 코드를 약간의 시간 동안 연구했고 그것에 대해 잊어 버렸다. 나는 코드를 수정하고 코드에서 사용되는 버퍼링을 발견했다.

bryant's book - rio functions

내가 HTTP/1.1 사용하던 만들고 있었다 또 다른 실수. HTTP 1.0을 사용하면 서버에서 데이터를 전송 한 후 연결을 닫습니다. 그래서 문제가 해결되었습니다.

+2

HTTP/1.1에서 요청 헤더'Keep-Alive : close'를 사용할 수 있습니다. – Piskvor

3

어쩌면 최종 청크가 버퍼를 플러시 할 정도로 크지 않을 수도 있습니다.

fd를 플러시하는 방법을 확인하고 마지막 청크를 보낸 후 수동으로 수행 할 수 있습니다.

+0

나는 당신의 요점을 얻을 수 없었다. –

+0

1024 바이트를 보낼 때 파일 디스크립터 내부 버퍼가 단독으로 플러시 될 정도로 커 보인다. 콘텐츠 크기가 작 으면 fd는 시간 초과를 기다린 다음 플러시하거나 닫을 수 있습니다. –

+0

마지막 청크에 필요한만큼 많은 바이트를 요청하고 있는데 1024가 아닌 것입니다. –

2

아니요. 내 생각에 서버가 flush()에 대한 호출을 잃어 버렸기 때문에 시간 초과가 될 때까지 출력이 일부 버퍼에서 멈 춥니 다 (서버가 플러시 될 때까지).

+0

하지만 내 웹 브라우저도 페이지를 다운로드하는 데 시간이 걸릴 것입니다. 그것은 사실이 아닙니다. 브라우저가 페이지를 즉시로드합니다. 내 프로그램은 대부분의 시간 마지막 덩어리를 기다리는 동안 약 8 초 걸립니다. –

+0

브라우저는 지금까지 전송 된 내용을 기반으로 작동하기 시작합니다. 예를 들어 PHP에서 웹 페이지의'head'를 쓴 후에'flush'를 호출하면 브라우저가'head'의 내용을로드하기 시작할 수 있으므로 나머지 페이지는 서체/로드. 브라우저는 와이어를 통해 마크 업을 얻 자마자 페이지를 구문 분석/렌더링하려고 시도합니다. 브라우저에서 바로 렌더링하는 것을 볼 수 있습니다. – geowa4

+0

확인 브라우저를 잊어 버리십시오. 나는 텔넷과 같은 행동을 보았다. –

관련 문제