Télécharger un fichier à partir du Web en C ++ sans utiliser de bibliothèques non standard sous Linux

Lorsque je parle de bibliothèques non standard, je fais référence à des choses comme Boost, libCurl et tout ce qui peut être fait de cette manière beaucoup plus facilement que le C ++ standard. La raison en est que j’écris une application en tant que pièce de cours (la classe est dédiée à C ++) et que je dois utiliser uniquement des bibliothèques et des fonctions standard.

Je cherche à télécharger un fichier RSS, en utilisant une URL que l’utilisateur fournira (je construis un client RSS rudimentaire), et le plus gros problème auquel je suis confronté est que je ne sais pas comment obtenir le fichier. Une fois ce bit dépassé, l’parsing des balises XML et de l’affichage du contenu sera relativement simple. J’ai regardé autour de moi et je n’ai trouvé que des solutions qui utilisent des bibliothèques non standard, généralement libCurl. Si quelqu’un pouvait me donner un aperçu de ce que je devrais regarder, alors je vous en serais reconnaissant.

De plus, si vous pensez que vous m’aidez à sortingcher, vous ne l’êtes pas. La tâche est de construire une application de notre choix et nous sums notés sur notre utilisation des différentes fonctionnalités du langage (il doit contenir autant de classes, utiliser ces types de variables, etc.).

Consultez le Guide de programmation réseau de Beej pour une introduction rapide mais excellente aux sockets. Si vous ne pouvez utiliser aucune bibliothèque non standard, votre seule option est de vous connecter manuellement au port 80 et de faire la demande vous-même.

En supposant même une connaissance de C ++ au niveau débutant, cela devrait être tout ce dont vous avez besoin.

Tout d’abord, cela ne peut pas être fait en utilisant uniquement le C ++ standard. Il n’y a pas d’interface réseau dans le standard C ++ ou le standard C.

Si vous devez suivre une approche “do-it-yourself”, alors l’intention est probablement d’utiliser l’API des sockets de votre plate-forme. Dans le cas de Linux, cela fait partie de la norme POSIX, pas de C ++, et est disponible à partir de .

La procédure de base est la suivante: parsingr l’URL; rechercher l’adresse IP du domaine; créer un socket; connectez la prise; écrire une requête HTTP sur le socket; lire la réponse HTTP à partir du socket; nettoyer.

De toute évidence, une bibliothèque HTTP est beaucoup plus pratique, d’autant plus qu’un téléchargement HTTP peut devenir plus compliqué que ce que je décris ci-dessus (par exemple, si le serveur répond par une redirection). Presque toutes les dissortingbutions Linux fourniront libcurl et / ou les programmes curl et wget .

Ecrire un programme pour faire une connexion socket est relativement sortingvial.

http://www.linuxhowtos.org/C_C++/socket.htm

Maintenant que vous avez un socket ouvert sur un serveur HTTP, vous devez comprendre comment demander un document et comment décoder la réponse:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html

Fondamentalement, vous devez envoyer:

 GETHTTP/1.1 Where: SP: Single Space CRLF: \r\n URL: The Full URL of the page including the server name. 

Ce que tu récupères sera

http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6

 HTTP/1.1200OK (
)*

Ce qui précède signifie:

  • La première ligne est la ligne de réponse qui doit contenir 200 OK.
    • Si ce n’est pas le cas, il y a une sorte d’erreur et vous devriez simplement abandonner.
  • Ceci est suivi par 0 ou plusieurs lignes d’en-tête
    • Ignorez simplement ces lignes
  • Il y aura 1 ligne vide pour marquer la fin des en-têtes.
  • Ensuite, le document sera sur le stream.

Si vous voulez vraiment le faire sans utiliser libcurl, vous pouvez toujours ouvrir une socket TCP puis envoyer:

 GET /myurl 

(http 1.0 ou de préférence utiliser http 1.1 )

Fondamentalement, vous écrivez une implémentation très simple du client du protocole http.

Vous pouvez télécharger le code source de l’utilitaire standard wget

Comme vous n’êtes pas autorisé à utiliser des bibliothèques non standard, vous pouvez écrire votre propre classe de wrapper primitive pour la commande linux “curl” (je suppose que vous utilisez linux). Curl est une commande très puissante, et elle peut probablement faire ce que vous en avez besoin.