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?
Répondre
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.)
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
@KillianDS: Merci! Fixé. –
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.
Utilisez une bibliothèque comme libcurl.
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
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.
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.
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
- 1. Générer par programme des fichiers JavaDoc
- 2. Comment enregistrer une page Web par programme?
- 3. lire les fichiers dans Linux depuis le programme .net?
- 4. comment charger les fichiers ASPX par programme?
- 5. Télécharger des fichiers par programme dans Django
- 6. Surveillance par programme des fichiers sous Windows
- 7. Comment déplacer par programme des fichiers dans un répertoire WebDAV
- 8. Comment puis-je obtenir des fichiers de l'iDisk par programme?
- 9. Comment extraire des données d'une page Web par programme?
- 10. Comment démarrer l'application Web pylons par programme?
- 11. Comment accéder à l'app store (depuis l'application) par programme?
- 12. Comment puis-je redémarrer l'iPhone par programme depuis mon application?
- 13. Comment diffuser des vidéos HD depuis le Web?
- 14. Diffusion de fichiers depuis un serveur Web depuis l'extérieur de l'application Web
- 15. Comment combiner des images à l'intérieur pdf par le programme?
- 16. 301 rediriger depuis le programme mod_rewrite RewriteMap
- 17. comment charger des fichiers depuis n'importe quel répertoire du programme c
- 18. Comment supprimer par programme tous les fichiers d'un répertoire http
- 19. Modification des autorisations de fichiers vista par programme
- 20. Téléchargement par programme de fichiers CSV avec Java
- 21. Configuration par programme d'endpoints par rapport à web/app.config
- 22. Obtention de paramètres pour le service Web par programme?
- 23. Manipulation de fichiers ogg multipiste par programme
- 24. Déterminer par programme les dimensions des fichiers image en bundle
- 25. Déterminer par programme le mode d'authentification
- 26. Connexion par programme à un site Web
- 27. Télécharger le JRE par programme?
- 28. Comment télécharger des fichiers sur django depuis AS3 Flash?
- 29. Comment lancer un programme depuis MySQL?
- 30. Comment appeler le service web depuis le code java?
Peut-être que vous pouvez appeler 'wget' ou tout autre programme externe pour télécharger le fichier? –
http://curl.haxx.se/libcurl/c/ – Amarghosh
ou regardez le code source de ces deux si vous ne pouvez pas les utiliser comme des boîtes noires. –