Pergunta

Eu estou escrevendo um aplicativo C ++ e gostaria de pedir a vários arquivos de dados por meio de uma solicitação HTTP GET simultaneamente, sempre que eu deveria olhar para começar (precisa ser multi-plataforma).

  1. Executar Aplicação
  2. Criar uma lista de URLs { " http: //host/file1.txt ", " http: //host/file2.txt ", " http: //host/file3.txt "}
  3. solicitar todos os URLs simultaneamente e carregar o conteúdo de variáveis ??(não quero gravações em disco). Cada arquivo tem cerca de 10kb of dados.

O que bibliotecas que você recomendaria que eu uso? libcurl? curlpp? impulsionar asio? Eu precisaria multi threading roll-meu-próprio para solicitar todos os arquivos simultaneamente? há uma maneira mais fácil?

Edit: Eu precisará pedido cerca de 1000 solicitações GET simultaneamente. O mais provável é que vou fazer isso em lotes (100 de cada vez, e criando mais conexões como feitas um está concluída).

Foi útil?

Solução

Eu recomendaria libcurl . Eu não sou super-familiarizado com ele, mas ele tem um multi-Interface para a realização de várias operações de HTTP simultânea.

Dependendo do que solução você vai com, é possível fazê-E / S assíncrona sem o uso de multithreading. A chave é usar o href="http://linux.die.net/man/2/select" rel="nofollow noreferrer"> select(2) chamada de sistema select() leva um conjunto de descritores de arquivos e informa se algum deles tem dados disponíveis. Se o fizerem, então você pode continuar a usar read(2) ou recv(2) sobre eles sem se preocupar com o bloqueio.

Outras dicas

Os navegadores da Web muitas vezes manter um pool de threads de trabalho para fazer downloads e transferências atribuir a eles como eles se tornam livres. IIRC o HTTP RFC tem algo a dizer sobre quantas conexões simultâneas você deve fazer ao mesmo servidor ao mesmo tempo:. Demasiadas é rude

Se vários dos pedidos são para o mesmo servidor, e suporta keep-alive (que quase todo mundo faz), então isso pode ser melhor comportamento do que spam-lo com várias solicitações simultâneas. A idéia geral é que você use uma conexão TCP / IP para várias solicitações em série, poupando assim a sobrecarga handshaking. O resultado prático, na minha experiência de implementação Java HttpConnection aulas, é que você introduzir um bug sutil para fazer com nem sempre limpar o estado corretamente quando você re-utilizar a ligação para uma nova solicitação, e gastar um tempo considerável olhando para o registo / sniffer dados; -)

libcurl certamente apoia keepalive (ativado por padrão, eu acho).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top