7
votes

Téléchargez HTTP THRU SOCKETS (C)

Récemment, j'ai commencé à prendre Ce guide pour vous aider à télécharger des fichiers à partir d'Internet. Je l'ai lu et j'ai trouvé le code suivant pour télécharger le corps HTTP d'un site Web. Le seul problème est que cela ne fonctionne pas. Le code s'arrête lorsque vous appelez l'appel RECV (). Il ne se bloque pas, il ne cesse de continuer à courir. Est-ce ma faute? Suis-je en train d'utiliser la mauvaise approche? J'intention d'utiliser le code pour non seulement télécharger le contenu des fichiers .html, mais également pour télécharger d'autres fichiers (ZIP, PNG, JPG, DMG ...). J'espère qu'il y a quelqu'un qui peut m'aider. Ceci est mon code: xxx


1 commentaires

Si l'intention est téléchargée des fichiers, n'ayant pas la mise en œuvre de HTTP, vous seriez mieux d'utiliser une bibliothèque telle que CURL: curl.haxx .se


3 Réponses :


3
votes

Vous devez envoyer une demande HTTP avant d'attendre une réponse. Vous code actuellement simplement pour une réponse qui ne vient jamais.

Aussi, n'écrivez pas les commentaires dans toutes les capuchons.


0 commentaires

7
votes

Le problème est que vous devez implémenter le protocole HTTP. Le téléchargement d'un fichier n'est pas une question de connexion au serveur, vous devez envoyer des demandes HTTP (avec une en-tête HTTP correcte) avant d'obtenir une réponse. Après cela, vous auriez toujours besoin d'analyser les données retournées pour supprimer plus d'en-têtes HTTP.

Si vous essayez simplement de télécharger des fichiers à l'aide de C, je vous suggère le Bibliothèque de curl , qui fait le Travail http pour vous.


0 commentaires

12
votes

Si vous souhaitez saisir des fichiers à l'aide de http, alors libcurl est probablement votre meilleur pari en C . Cependant, si vous utilisez cela comme moyen d'apprendre la programmation de réseau, vous devrez apprendre un peu plus sur http avant de pouvoir récupérer un fichier.

Ce que vous voyez dans votre programme actuel est que vous Besoin d'envoyer une demande explicite pour le fichier avant de pouvoir le récupérer. Je commencerais par lire par RFC2616 . N'essayez pas de tout comprendre - il est beaucoup à lire pour cet exemple. Lire le Première section pour comprendre le fonctionnement HTTP, puis lire des sections 4, 5 et 6 pour comprendre le format de message de base .

Voici un exemple de quelle demande HTTP pour la page Questions Stackoverflow a l'air: xxx

Je pense que c'est une demande minimale. J'ai ajouté explicitement les CRLF pour montrer qu'une ligne vierge est utilisée pour terminer le bloc d'en-tête de demande Comme décrit dans RFC2616 . Si vous laissez dehors the Accepter-coding En-tête, le document de résultat sera alors transféré sous la forme d'un flux compressé GZIP puisque HTTP le permet de dire explicitement que si vous ne le souhaitez pas que vous ne le souhaitez pas.

La réponse du serveur contient également des en-têtes HTTP pour les méta-données décrivant la réponse. Voici un exemple de réponse de la demande précédente: xxx

Cet exemple simple devrait vous donner une idée de ce que vous souhaitez implémenter si vous souhaitez saisir des fichiers à l'aide de HTTP. C'est le meilleur cas, exemple le plus simple. Ce n'est pas quelque chose que je voudrais entreprendre à la légère, mais c'est probablement le meilleur moyen d'apprendre et d'apprécier http.

Si vous recherchez un moyen simple d'apprendre la programmation de réseau, c'est une manière décente de début. Je recommanderais de ramasser une copie de TCP / IP illustré, volume 1 et Programmation réseau Unix, volume 1 . Ce sont probablement le meilleur moyen d'apprendre vraiment à écrire des applications basées sur des réseaux. Je commencerais probablement en écrivant un client FTP depuis FTP est un protocole beaucoup plus simple pour commencer.

Si vous essayez d'apprendre les détails associés à http , alors:

  1. Acheter http: le guide définitif et lisez-le
  2. Lire RFC2616 jusqu'à ce que vous le comprise
    • Essayez des exemples à l'aide de Telnet Server 80 et de taper les demandes à la main
    • Téléchargez le client CURL et utilisez le - verbose et - Inclure les options de ligne de commande pour que vous puissiez voir ce qui se passe
    • lire thèse de fusion jusqu'à ce que http ait vraiment un sens .

      Ne prévoyez pas d'écrire votre propre client HTTP pour Enterprise Use . Vous ne voulez pas faire cela, faites-moi confiance comme celui qui a maintenu une telle erreur pendant un moment ...


3 commentaires

Je tiens vraiment vraiment vraiment à vous remercier pour la réponse rapide, surtout d.shawley. Je suppose que le téléchargement de fichiers n'allait pas être aussi facile que je pensais, mais je vais certainement obtenir cela pour travailler. Je veux que cela fonctionne parce que je veux être indépendant de la bibliothèque Curl, et si cela ne fonctionnera pas ... CURL sera toujours là. Merci, IEF2


@ LEF2. Vous êtes bienvenue. Je vais offrir des conseils cependant. En utilisant des implémentations de protocoles complexes que d'autres mises à disposition sont une partie importante du logiciel de développement. J'embraînerais des bibliothèques comme Curl, Apache Portable Runtime, Boost et d'autres bibliothèques populaires. Ecrire tout ce que vous êtes une recette pour la catastrophe. C'est un très bon moyen d'apprendre comment fonctionne un protocole, mais un très mauvais moyen d'utiliser HTTP à la couche d'application.


J'étais d'accord avec vous jusqu'à ce que vous ayais mentionné APR, qui est la plus grande abomination que j'ai jamais vue dans C ...