2010-05-06 2 views
3

Comment les fichiers sont-ils téléchargés à partir de serveurs dans des langages de programmation comme C? Je comprends que les langues de niveau supérieur ont des fonctions magiques comme "download_file_from_url()" mais elles ne m'aident pas à comprendre ce qui se passe réellement. Je suis un peu familier avec les sockets, mais la programmation réseau en général est toujours une boîte noire pour moi. Merci pour toute aide.Comment télécharge-t-on par programme des fichiers depuis le web?

+3

Peut-être que vous pouvez appeler 'wget' ou tout autre programme externe pour télécharger le fichier? –

+0

http://curl.haxx.se/libcurl/c/ – Amarghosh

+0

ou regardez le code source de ces deux si vous ne pouvez pas les utiliser comme des boîtes noires. –

Répondre

12

En fait, à un niveau faible ish, le programme ouvre un socket au port 80 (habituellement) sur le serveur et l'envoi d'une demande qui ressemble à ceci:

GET /index.html HTTP/1.1 
Host: stackoverflow.com 

... suivi d'une ligne vide.

Le serveur répond ensuite avec les données, qui consistent généralement en quelques lignes d'en-tête, une ligne vide et la ressource demandée. Avec HTTP 1.1 la valeur par défaut est de garder la connexion active pour les requêtes suivantes (bien que le serveur puisse la terminer si cela lui plaisait); Si j'avais utilisé HTTP 1.0 ou ajouté un en-tête Connection: close, le serveur romprait la connexion après l'envoi de la ressource.

Consultez le Wikipedia article on HTTP pour plus de détails, ou si vous voulez vraiment entrer dans, the spec (tout-en-une-page here). Vous pouvez voir à quoi cela ressemble si vous avez telnet (et vous le faites probablement). Tapez simplement telnet stackoverflow.com 80, puis tapez les lignes ci-dessus. N'oubliez pas d'appuyer sur Entrée sur la ligne vide.

Vous ne voulez pas voulez réinventer cette roue. Pratiquement tous les langages et environnements ont une bibliothèque disponible pour vous aider à gérer toutes les complexités. (Par exemple, essayez l'exemple ci-dessus avec www.stackoverflow.com au lieu de stackoverflow.com dans les deux endroits   — vous obtenez une réponse "déplacé définitivement" parce que l'équipe SO veut que SO soit à stackoverflow.com, pas www.stackoverflow.com Il y a aussi des réponses "déplacées temporairement", etc., etc.)

+1

Vos données sont erronées. Si HTTP/1.1 est spécifié, le serveur doit maintenir la connexion active, sauf si "connection: close" est passé en tant qu'en-tête. – KillianDS

+0

@KillianDS: Merci! Fixé. –

9

Vous devriez vérifier libcurl - il est open source afin que vous puissiez le creuser et voir comment une bibliothèque respectée approche le problème.

4

Et une « boîte noire » est probablement une bonne façon de garder :-)

Vous faites la même chose en C que vous le feriez dans « langues de niveau supérieur » - utiliser une fonction de bibliothèque qu'elle ne pour toi. (La différence est que la fonction de bibliothèque n'est pas une partie intégrée standard du langage).

Un choix C est libcurl

1

Si vous téléchargez un fichier en utilisant HTTP, vous devriez lire RFC on HTTP (comment les données est divisé par morceaux, etc.), en utilisant FTP - RFC on FTP (commandes qui sont utilisées, par exemple PWD, CD etc.). Cependant, ce sont des protocoles de plus haut niveau qui utilisent des sockets de toute façon.

1

Pour télécharger un fichier (supposez un cas simple - pas de pare-feu etc ...), Vous devez:

  • Se connecter à un serveur DNS pour résoudre le nom du serveur de l'URL dans une adresse IP

  • Ouvrir une connexion à cette adresse IP sur le port ou le port par défaut de l'URL de votre protocole (80 pour http)

  • Envoyer la commande HTTP appropriée sur ce serveur

  • Ecoute de réponse HTTP

  • Réponse du procédé correctement, et si la réponse contient les données du fichier, keepr eding le Reponse et enregistrer les données dans le fichier temp

  • Lorsque le fichier est entièrement téléchargé, fermez la connexion et déplacer le dossier complet temp en bonne emplacement.

+1

bien que j'aime le détail/la spécificité de votre réponse - pourquoi inclure la balle # 1 comme c'est automatique sur presque tous les systèmes imaginables où cela pourrait être développé? Notez également que vous avez donné la version de 35 000 pieds, ce qui n'est pas du tout spécifique à la requête de l'OP. – KevinDTimm

Questions connexes