2009-11-05 15 views
2

프로그램에서 HTTP 요청을해야 할 때마다 새 스레드가 만들어지고 동시에 여러 개가 실행될 수 있습니다. 내가 가지고있는 문제는 이미 실행중인 스레드가 두 개있는 경우 HttpSendRequest()을 호출 한 후 InternetReadFile()을 읽었을 때 반복적으로 읽는 경우 HttpSendRequest()을 호출하는 모든 후속 시도가 해당 호출에 걸려서 앞서 언급 한 것으로 끝납니다 두 스레드는 연결 상태를 계속 읽을 수 있지만 세 번째 스레드는 시간이 초과 될 때까지 HttpSendRequest()에서 차단됩니다.두 개 이상의 다운로드가 이미 진행 중일 때 HttpSendRequest 차단

내 스스로 찾을 수 있었던 것부터 이것은 단지 wininet 작동 방식 일 수 있습니다. the HTTP spec은 다음과 같이 권장합니다. "단일 사용자 클라이언트는 모든 서버와 2 개 이상의 연결을 유지하면 안됩니다. 대리."

여러 프로그램이 동일한 서버에 여러 개의 동시 다운로드를 처리하는 것을 보았습니다. 그러나 나는 다양한 연결을 관리하거나 자신의 http를 작성하는 측면에서 추가 작업을 많이해야한다고 생각합니다. 인터페이스.

두 개 이상의 활성 세션을 처리하도록 설정하는 데 많은 복잡성이 필요하다면 한 번에 하나 또는 두 개의 파일 만 처리하여 나머지는 대기 상태로 둡니다. 그러나 한 번에 두 개 이상을 허용하는 약간의 복잡하지 않은 방법이 있다면 (머리 꼭대기에서 벗어나 다운로드마다 새로운 프로세스를 사용하는 것이 좋을지 모르지만 지저분 할 것입니다), 이는 바람직 할 것입니다. 그것은 어쨌든 동시에 3 ~ 5 번 이상 다운로드되는 것과는 다르며 각 다운로드는 사용자의 요청에 의한 것입니다. 제한을 변경하기 위해 레지스트리 해킹에 대한 언급을 읽었지 만, 그건 분명히 할 일이 아닙니다. 어떤 아이디어?

답변

4

HTTP 1.1 표준은 서버 당 최대 2 개의 동시 연결을 요구합니다. IE5, IE6 또는 IE7이 설치되어있는 경우 InternetSetOption()을 사용하여 제한을 늘릴 수 있습니다 (INTERNET_OPTION_MAX_CONNS_PER_SERVER 및 INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER 옵션 참조). 그러나 IE8과 함께 설치된 WinInet 버전은 해당 기능을 비활성화합니다 (http://connect.microsoft.com/WNDP/feedback/ViewFeedback.aspx?FeedbackID=434396http://connect.microsoft.com/WNDP/feedback/ViewFeedback.aspx?FeedbackID=481485 참조).

+1

IE8의 변경으로 인해 특정 솔루션을 사용할 수 없더라도 많은 정보를 제공합니다. 왜 내가 내 검색에서 그 중 하나를 찾을 수 없었는지 모르겠지만, 나는 올바른 장소를보고 있지 않았다. –

+1

사실, 이것을 테스트 한 후에 IE8이 설치되어 있지만 최대 연결 수를 2 개 이상으로 설정할 수 있으며 작동합니다 (InternetQueryOption에서 설정 한 값을 반환하며 실제로 지정된 수의 동시 연결을 가질 수 있습니다). 아마도 최근 업데이트에서 다시 변경되었지만이를 확인할 수는 없습니다. 그리고 누군가가 IE8을 가지고 있다면, 그들은 이미 정기적으로 업데이트 할 것이기 때문에 고정되어 있다면 설정해야한다고 생각합니다. –

1

InternetOpen() 번으로 여러 번 전화하는 경우 InternetOpen()이 반환 한 각 HINTERNET에 두 개의 파일을 동시에 다운로드 할 수 있어야합니다.

+0

나는 InternetOpen()에서 열린 HINTERNET 핸들을 재사용하고 연결마다 새 것을 열어 보았습니다. 그러나 어느 쪽이든 여전히 활성 연결 수를 두 개로 제한하고 있습니다. 그 한계를 높이는 방법. –

관련 문제