문제

C ++ 애플리케이션을 작성하고 있으며 HTTP GET 요청을 통해 동시에 여러 데이터 파일을 요청하고 싶습니다. 시작 해야하는 곳 (크로스 플랫폼이어야 함).

  1. 응용 프로그램 실행
  2. URL 목록 작성 { "http : //host/file1.txt", "http : //host/file2.txt", "http : //host/file3.txt"}
  3. 모든 URL을 동시에 요청하고 내용을 변수에로드하십시오 (디스크 쓰기를 원하지 않음). 각 파일에는 약 10KB의 데이터가 있습니다.

내가 어떤 라이브러리를 사용 하시겠습니까? libcurl? curlpp? ASIO를 부스트? 모든 파일을 동시에 요청하려면 롤 마시운 멀티 스레딩이 필요합니까? 더 쉬운 방법이 있습니까?

편집 : 약 1000 개의 GET 요청을 동시에 요청해야합니다. 아마도 나는 이것을 배치로 할 것입니다 (한 번에 100 씩, 완성 된 더 많은 연결을 만들어 낼 것입니다).

도움이 되었습니까?

해결책

추천합니다 libcurl. 나는 그것에 매우 친절하지 않지만 그것은 다중 인터페이스 다중 동시 HTTP 작업을 수행합니다.

어떤 솔루션을 사용하는지에 따라 멀티 스레딩을 사용하지 않고 비동기 I/O를 수행 할 수 있습니다. 열쇠는 사용하는 것입니다 select(2) 시스템 호출. select() 파일 디스크립터 세트를 가져 와서 데이터를 사용할 수 있는지 알려줍니다. 그렇다면 계속 사용할 수 있습니다. read(2) 또는 recv(2) 차단에 대해 걱정하지 않고 그들에게.

다른 팁

웹 브라우저는 종종 다운로드를 수행하기 위해 작업자 스레드 풀을 유지하고 무료가 될 때 다운로드를 할당합니다. IIRC HTTP RFC는 동시에 동시에 동시에 동시에 연결 해야하는 동시 연결 수에 대해 할 말이 있습니다.

몇 가지 요청이 동일한 서버에 있고, 거의 모든 사람이하는 keep-alive (거의 모든 사람이하는)를 지원하는 경우 여러 동시 요청으로 스팸을 보는 것보다 더 나은 동작 일 수 있습니다. 일반적인 아이디어는 여러 요청에 하나의 TCP/IP 연결을 사용하여 핸드 쉐이킹 오버 헤드를 저장한다는 것입니다. 실질적인 결과, Java HTTPConnection 클래스를 구현 한 경험에서 새로운 요청에 대한 연결을 재사용 할 때 항상 상태를 올바르게 정리하는 것은 아니며 로깅/스니퍼를 응시하는 데 상당한 시간을 소비하는 것입니다. 데이터 ;-)

Libcurl은 확실히 keepalive를 지원합니다 (기본적으로 활성화됩니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top