solicitações GET C ++ simultâneas
-
03-07-2019 - |
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).
- Executar Aplicação
- Criar uma lista de URLs { " http: //host/file1.txt ", " http: //host/file2.txt ", " http: //host/file3.txt "}
- 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).
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 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).