2009-04-30 4 views
2

저는 C++ 응용 프로그램을 작성 중이며 동시에 HTTP GET 요청을 통해 여러 데이터 파일을 요청하고 싶습니다. 어디에서 시작해야합니까 (크로스 플랫폼이어야 함).C++ 동시 GET 요청

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

어떤 라이브러리를 사용 하시겠습니까? libcurl? 컬프? 부스트 asio? 모든 파일을 동시에 요청하려면 다중 스레드 스레딩이 필요합니까? 더 쉬운 방법이 있습니까?

편집 : 약 1000 건의 요청을 동시에 요청해야합니다. 대부분이 작업을 한 번에 100 개씩 수행하고 하나의 연결이 완료되면 더 많은 연결을 생성합니다.

+0

왜 파일을 병렬로 요청해야합니까? URL이 매우 큰 경우에만 10kB가 크면 눈에 띄는 지연이 발생하지 않습니다. 동시성은 의심스러운 이득을 위해 구현을 훨씬 더 복잡하게 만듭니다. – lothar

+0

각 get을 수행하는 데 100ms의 대기 시간이 있고 10 개의 파일이있는 경우 병렬 도달은 1000ms가 아닌 100ms로 완료됩니다. –

+0

@lothar 예, URL 목록은 참으로 길었습니다 (10-1000 번). 설명하기 쉽도록 설명에 3 개의 URL을 사용했습니다. GET 요청은 대기 시간이 길지만 일단 스트리밍을 시작하면 초고속 (대기 시간이 문제)이므로 동시성이 필요합니다. –

답변

4

나는 libcurl을 권하고 싶습니다. 나는 그것에 친숙하지는 않지만 복수의 동시 HTTP 작업을 수행하기 위해 multi-interface을 가지고있다.

어떤 솔루션을 사용 하느냐에 따라 멀티 스레딩을 사용하지 않고 비동기 I/O를 수행 할 수 있습니다. 핵심은 select(2) 시스템 호출을 사용하는 것입니다. select()은 일련의 파일 설명자를 취하여 사용 가능한 데이터가 있는지 알려줍니다. 그럴 경우 차단을 걱정하지 않고 read(2) 또는 recv(2)을 사용할 수 있습니다.

2

웹 브라우저는 다운로드를 위해 작업자 스레드 풀을 유지 관리하고 다운로드가 자유롭게 될 때 다운로드하도록 할당합니다. IIRC는 HTTP RFC가 동시에 같은 서버에 얼마나 많은 동시 연결을해야하는지에 대해 말하고 있습니다. 너무 많은 것은 무례합니다.

여러 요청이 동일한 서버에 있고 연결 유지를 지원하면 (거의 모든 사용자가 그렇듯이) 여러 동시 요청으로 스팸하는 것보다 더 좋은 동작 일 수 있습니다. 일반적인 아이디어는 일련의 여러 요청에 하나의 TCP/IP 연결을 사용하여 핸드 셰이크 오버 헤드를 줄이는 것입니다. 실용적인 결과는 Java HTTPConnection 클래스를 구현 한 경험에서 새로운 요청에 대한 연결을 재사용 할 때 상태를 항상 올바르게 지우는 것과 관련이없는 미묘한 버그를 소개하고 로깅/스니퍼를 쳐다 보는데 상당한 시간을 할애한다는 것입니다 데이터 ;-)

libcurl은 확실히 keepalive를 지원합니다 (기본적으로 활성화되어 있다고 생각합니다).

+0

이것은 실제로 우리 LAN에있는 몇 대의 서버 사이에서 통신하기위한 것입니다. 따라서 무례한 것은 괜찮습니다. :) 연결 재사용에 대한 좋은 생각. –