TÉLÉCHARGER UN FICHIER (WIN32, SOCKETS)

cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 - 28 juin 2004 à 21:19
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009 - 22 août 2007 à 11:50
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/24109-telecharger-un-fichier-win32-sockets

cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009
22 août 2007 à 11:50
Ok j'ai rien dit... 10/10 !
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009
22 août 2007 à 11:48
Salut,ça m'a bien l'air d'une tres bonne source pourtant ça ne compile pas (devcpp)
j'ai bien viré les pragma et linké manuellement libcomctl32.a et libwsock32.a
pourtant j'obtient des [Linker error] undefined reference to `WSACreateEvent@0' etc...
Une idée ?
realic Messages postés 16 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 29 janvier 2016
30 avril 2007 à 08:58
Oui, en fait, j'ai mieux géré les offsets, et ca a marché. Pour tester, le mieux est de faire sur un fichier txt afin de voir si les phrases sont dans le bon ordre.
Mais maintenant ca marche parfaitement, merci pour ton aide.
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
25 avril 2007 à 17:51
Salut,
C'est sur qu'avant d'ecrire dans le fichier, il faut prendre en compte les offsets de la reponse et pas ceux que tu as demandés, car ils peuvent etre different.
Par contre pour le fichier corrompu, je pense qu'il faut logguer toutes les requetes et les reponses et que tu fais, avec les offsets et les content-length des réponses, et verifier 'a la main'.
realic Messages postés 16 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 29 janvier 2016
25 avril 2007 à 11:44
Salut,

Bon, le téléchargement "par partie" ne fonctionne pas du fait de "fichier corrompu".
Je vais te dire ce que je fais, et peut-être que quelqu'un pourra me dire pourquoi ca ne marche pas :
lors du premier lancement, j'arrête la fonction après récupération de la taille du fichier, donc après lecture dans le header. Puis je défini un pas d'avancement (1/15 de la taille du fichier)
pour les 14 autres lancements (pour tester le téléchargement par partie, en fait, je récupère le fichier découpé en 14 partie) :
pareil sauf que au lieu de faire un get "simple", je lui ajoute les propriétés "Range : bytes=tailleDebut-tailleFin"
tailleDebut est la valeur qu'avait tailleFin lors de la dernière exécution.
tailleFin est égale à sa valeur précédente+pas, sauf si cette valeur est inférieure à la taille réellement téléchargée (qui est sûre diffère à 99%).

Est-ce que quelqu'un aurait une idée? Je pense que c'est du au fait que je prenne en considération les header à chaque fois que je télécharge, mais je ne suis pas sur.
realic Messages postés 16 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 29 janvier 2016
19 avril 2007 à 09:08
OK merci, je vais regarder son fonctionnement.
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
18 avril 2007 à 17:54
Salut,
Pas du tout, le WriteFile ne fait qu'ecrire sur le disque (comme fwrite). Pour specifier l'offset ou tu veux écrire, il faut utiliser SetFilePointer(comme fseek).
realic Messages postés 16 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 29 janvier 2016
18 avril 2007 à 10:19
J'aurais voulu savoir :
WriteFile(hFile, pBuffer, dwRecu, &dwEcrit, 0);

Est-ce que cette fonction est équivalente à faire un seek ?

Car d'après ce que j'ai compris, si je veux faire des dl par parties, sans forcément que celles-ci se suivent, il faut que je puisse écrire à un endroit précis dans le fichier.
Donc, dwRecu correspond au début de l'endroit où l'on écrit, et &dwEcrit correspond à la fin de l'endroit où on écrit ?
par exemple, si on veut écrire des données entre les bytes 1234 et 4567, on écrit :
WriteFile(hFilen,pBuffer,1234,4567,0).
est-ce bien cela, ou est-ce que la fonction fait de manière différente ?
realic Messages postés 16 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 29 janvier 2016
18 avril 2007 à 09:25
Salut,

Merci pour cette explication, mais est-ce que le logiciel va comprendre qu'il faut qu'il ajoute les données trouvées aux données déjà existantes ?
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
17 avril 2007 à 18:52
Salut,
C'est un petit prog que j'avais posté comme ca, c'est pas vraiment utilisable en vrai pour les raisons que tu as cité. Pour que ca soit vraiment utilisable, faudrait gerer le resuming, splitter le download en plusieurs transferts, faire un traitement d'erreur plus poussé... en bref, faire un vrai download manager.

Pour gerer le resuming en http:

1) requete
On peut demander une partie du fichier en mettant le champ 'Range' dans la requete GET.
Les offsets que l'ont met dans le champ sont tous inclusifs.
Range: bytes=1000-2000 // demander de l'offset 1000 (inclus) a l'offset 2000 (inclus)
ou
Range: bytes=1000- // demander tout le fichier a partir de l'offset 1000 (inclus)
On peut faire d'autres trucs plus compliqué avec Range, mais ca ca suffit pour faire du resuming.

2) reponse
En cas de success, le serveur réponds a une requete qui contient un 'Range' par un code 206 ('Partial Content' ou un truc du genre), et
place un champ 'Content-Range' de cette forme la:
Content-Range: bytes 3668247-7336494/11004733
qui contient de gauche a droite: l'offset de depart des données, l'offset de fin des données, et la taille du fichier.
Souvent, il met aussi un 'Content-Length', mais faut pas trop s'y fier et plutot regarder le 'Content-Range' (a mon avis).

3) support
Et aussi, le serveur indique qu'il supporte les requetes 'Range' en mettant 'Accept-Ranges: bytes' dans toutes ses réponses.
realic Messages postés 16 Date d'inscription jeudi 16 novembre 2006 Statut Membre Dernière intervention 29 janvier 2016
17 avril 2007 à 17:23
Salut,

Ton programme ne gère pas la fonction "resume", ce qui peut être gênant, car si le dl plante pour x résons, faut tout recommencer.
Je vais essayer de faire cette fonction, mais si quelqu'un sait vraiment comment faire, qu'il me le dise, ou si il l'a déjà fait....

Très bon programme sinon.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
21 déc. 2005 à 17:43
J'ai essayé oui, mais le serveur me répond toujours
Connection: close dans le header de la réponse
C'est sans doute le serveur qui force la fermeture de la connexion, et visiblement on ne peut rien y faire
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
21 déc. 2005 à 17:38
Salut,
J'avoue que j'en ai aucune idée, as tu essayé de mettre un Connection: Keep-Alive du http/1.0 (pour "forcer" le serveur a garder la connexion) ?
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
21 déc. 2005 à 14:46
J'ai modifié ton code pour passer une requête HTTP 1.1
Visiblement c'est possible (http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html), mais je n'y arrive pas car je recois une demande de fermeture du serveur, alors que dans le rfc c'est écrit de supposer qu'il n'y en n'aura pas
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
21 déc. 2005 à 13:48
Serait-il possible de la même manière de télécharger plusieurs fichiers (envoyer plusieurs requêtes) à la suite, en ne se connectant qu'une fois. Ici on recoit un FD_CLOSE donc j'ai l'impression que non, mais peut être qu'il y a quelque chose à modifier pour que ce soit possible?
Merci
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
25 juil. 2005 à 13:39
Source très instructive, merci ;-)
cs_HerveRV Messages postés 3 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 7 janvier 2005
7 janv. 2005 à 12:48
sisi, ça vient de ton programme, que j'ai modifié pour avoir des détails
je me rappelle plus comment, mais quand y a un probleme lors de la requette, j'ai demandé a voir un message d'erreur détaillé, que j'ai montré dans mon post

sinon, c pas grave, bosse bien ton projet, et bonne chance dans tes études ;)
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
7 janv. 2005 à 02:04
Salut,
Le "HTTP/1.1 404 Not Found" est copié de ton premier post.
C'est ton navigateur qui a du te sortir ca (pas mon prog en tout cas).

Pour la mise à jour, je pense pas que ca va etre possible car je suis sur un autre projet qui me prend pas mal de temp, et en plus les examens approchent..
cs_HerveRV Messages postés 3 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 7 janvier 2005
7 janv. 2005 à 01:45
aardman, le 3eme fichier est un fichier sur le ftp d'un pote ;)
il a du virer son fichier entre temps !

mais malgré tout, si tu peux mettre a jour ton programme pour qu'il marche avec tous type d'url, ça me serait utile a moi et des amis, car c vraiment pratique :p
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
6 janv. 2005 à 19:08
Salut,
joeblack59 > il faut créer un projet win32 pour compiler le prog.

HerveRV (avec pas mal de retard) >
pour la deuxieme url, je pense que l'erreur se situe au niveau de la fonction qui analyse l'url, et donc la connexion doit se faire sur un mauvais host/port, d'ou l'erreur de connexion.
pour la troisieme url, je vois pas de probleme: mon prog affiche "Fichier introuvable", et le navigateur t'affiche "HTTP/1.1 404 Not Found".
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 janv. 2005 à 19:02
Faut faire un projet Win32 GUI et non console.
joeblack59 Messages postés 5 Date d'inscription jeudi 28 octobre 2004 Statut Membre Dernière intervention 6 janvier 2005
6 janv. 2005 à 18:54
ton programme m'a l'air vraiment intéressant, mais quand j'appuie sur entrée, il me fait rien! le telechargement ne se fait pas!
quand je vais au niveau du programme, il compile bien, mais il link pas : il me met deux erreurs :
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/zzz.exe : fatal error LNK1120: 1 unresolved externals
je comprends pas à quoi, c du? c un pbm de librairies?
je suis débutant...
merci
cs_HerveRV Messages postés 3 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 7 janvier 2005
20 oct. 2004 à 00:16
très bien ce petit programme

par contre, j'ai fais un essai avec le fichier
http://www.kiss-cool.com/KissCool_2.mpg
ça fonctionne

le fichier
http://underfire.no-ip.com:8000/xoops/upload4u/ace1_wmv9.avi
donne "Erreur lors de la connexion."

et le fichier
http://www.sebastien-fritz.com/site/cv/cv.pdf
me donne ceci :

Envoi de la requette http au serveur...
Fichier introuvable. détails :

HTTP/1.1 404 Not Found
Date: Tue, 19 Oct 2004 21:53:45 GMT
Server: Apache
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>404 Not Found</TITLE>
</HEAD>
Not Found

The requested URL /site/cv/cv.pdf was not found on this server.
<HR>
Apache/1.3.29 Server at www.sebastien-fritz.com Port 80
</HTML>

voila, donc je voudrais savoir pkoi ça fonctionne pas, alors dans un navigateur ça fonctionne !!!
merci
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 sept. 2004 à 18:59
Ne serait pas une combinaison de 6 ans pour l'un et 6 mois pour l'autre ?
Ou aurais je encore dit une connerie ?
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
15 sept. 2004 à 12:45
66 ans... Je parie que guy est a gauche
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 sept. 2004 à 18:36
va dans les options de ton compte, menu a gauche.
Prepare avant un PETIT jpg au besoin.
cs_guyvdv Messages postés 101 Date d'inscription samedi 16 mars 2002 Statut Membre Dernière intervention 19 mai 2011 1
13 sept. 2004 à 18:19
Petite Question :
Comment je mets une foto dans mon profile au lieu du point d'interogation

Guy
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 sept. 2004 à 18:14
Y a eu VS 2002 puis le 2003 depuis et dans quelques moi arrivera le 2005.
cs_guyvdv Messages postés 101 Date d'inscription samedi 16 mars 2002 Statut Membre Dernière intervention 19 mai 2011 1
13 sept. 2004 à 18:13
Esseque VC6 est trop vieux , il y a plus nouveau?
Tu travaille avec quoi ?

CA FONCTIONNE
A gauche dans FileView/SourceFiles un click droit et on a un menu ou on peut ajouter des fichier
(ceux-ci pour le amateur qui lisent avec nous)

Merci et je continu
Guy
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 sept. 2004 à 18:00
Je n'ai plus de VC6 depuis pas mal de temps mais y aurait pas un menu popup quand clic droit sur nom de projet dans la fenetre view project ? un truc 'insert files' ou machin de ce genre.
Les fichiers a inserer sont:
resource.h
resource.rc
1.ico
download.cpp
cs_guyvdv Messages postés 101 Date d'inscription samedi 16 mars 2002 Statut Membre Dernière intervention 19 mai 2011 1
13 sept. 2004 à 17:52
Cher BruNews,

Dans VC6 il y a les possibilité d'ouvrire les project:
ATL Com App Wizard
Cluster Resource Type Wiz(ard)
Custom App Wiz
Database Project
Dev Studio Add-in Wiz
Extended Stord Proc Wiz
ISAPI Extension Wiz
MakeFile
MFC ActiveX Control Wiz
MFC App Wiz(DLL)
MFC App Wiz(EXE)
New Database Wiz
Utility Proj
Win32 Application
Win32 Console Appli
Win32 Dynamic-Link Library
Win32 Static Lib

J'ai choisis "Win32 Application"
J'ai construi un proj vide.
J'ai copié des fichiers:
main.cpp
res.rc
resource.h
url_code.sln
url_code.vcproj
Release
l ib
main.dsp
Debug
main.ncb
main.plg
main.opt
main.dsw

Ceux avec l'extension h,rc,cpp
ico il y en avai pas

Dans VisStudio VC 6 j'ai cherché pour trouver insert fichiers existants, mais je n'ai pas trouvé.

Et Maintenant ??

Guy
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 sept. 2004 à 16:09
aardman c'est VC6 pour lui.
Fais un new proj win32 APP GUI et VIDE.
Copie h, rc, cpp et ico dans dossier du proj. Dans VS tu fais insert fichiers existants *.* et tu select tout en 1 passe.
Devrait compiler.
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
10 sept. 2004 à 16:03
Salut,
Si tu as Visual Studio d'installé, normalement tu as juste a double-cliquer sur le fichier *.vcproj ou le *.sln pour ouvrir le projet.
cs_guyvdv Messages postés 101 Date d'inscription samedi 16 mars 2002 Statut Membre Dernière intervention 19 mai 2011 1
10 sept. 2004 à 15:30
Bonjour Aardman ( en hollandais hommes de la terre )

Je suis plustot vb, mais j'essaye un peut le VC.
Ta source est excellente pour apprendre un peu le va et vient d'internet.
Mais ...
Le fichier exe fonctionne ( naturellement) tres bien mais je ne vois pas comment l'implenter dans VC de visualStudio6

Avec VB il suffi de double cliquer sur la source *.vbp mais cela je n'ai pas trouver pour VC6.

Peut tu m'aider

Guy van der velden
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
2 juil. 2004 à 12:11
Salut,
Pour DevC++, je faut que tu enleves les #pragma comments du code et que tu link les lib directement dans les options du projet.
Mingain Messages postés 44 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 février 2006
2 juil. 2004 à 10:08
ma source ne fonctionne pas avec DevC++ ! Dommage ...
neo_00110010101 Messages postés 360 Date d'inscription samedi 27 septembre 2003 Statut Membre Dernière intervention 30 mai 2006
29 juin 2004 à 11:51
j'ai essayé avec l'image de ma page d'acceuil :
- le copier/coller marche
- la progress bar utile
- affichage temps restant (*)
- affichage de la vitesse

(*) petit problème, à la fin du téléchargement c'est toujours marqué [1 sec]

en plus, ça marche (bah oui !) et même si on arrête le DL, on a quand même un résultat (au moins pour les images)

Donc c'est excellent !!!!!!!!!!!!!!!! 10/10 (dommage que ça ne fait pas monter la note) ^^
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 juin 2004 à 01:21
wunderbar!
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
29 juin 2004 à 01:02
oui, il me semble qu'il y a de jolies plages la bas, et en plus c'est pas trop loin de chez moi.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
29 juin 2004 à 00:13
bah oui comme d'hab j'avais fait la 1ere correction comme un sauvage.
Saint Aigulf ça doit te causer ? Surement je fais un saut la-bas vers octobre, je te dirai.
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
28 juin 2004 à 23:55
Salut,

LordBob: merci pour le commentaire ! Comme tu dis, je trainais plus trop sur cppfrance à cause du bac mais maintenant je suis en vacance donc me revoila..

Brunews: merci pour les corrections, j'ai mis la source a jour avec la version "propre" de la fonction. C'etait la derniere fonction que j'avais a faire, je devais etre trop pressé de finir.
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
28 juin 2004 à 21:19
source de grande qualité qui montre bien comment telecharger un fichier depuis internet... de plus cela fesait un moment que je n'avais pas vu aardman trainé du coté de cppfrance...
enfin tres bon exemple...
Rejoignez-nous