[dev-cpp]archivage des liens d'une recherche sur google

Soyez le premier à donner votre avis sur cette source.

Vue 4 437 fois - Téléchargée 357 fois

Description

Bonjour
Je me présent, je m'appelle Sébastien, j'ai 16 ans et programme en C depuis cet été, donc pour moi depuis peut. J'ai réalisé cette source pour m'amuser, mais certain de mes amis on trouvé ce code intéressant donc pour remercier l'Open Source car c'est ce concept qui m'a appris a programmer en C, je donne mes sources pour que d'autres puissent l'utiliser ou ce que je préfère APPRENDRE avec cette source.
Cette source est un peut brouillon je sais mais voila...
Cette source est programmé sur dev-cpp avec les librairies de base et elle est complète.!
Comme c'est ma première source j'aimerais bien savoir ce que vous en pensez.

Source / Exemple :


#include <urlmon.h>
#pragma comment(lib, "Urlmon.lib")

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {  
	URLDownloadToFile(0, "zip", "zip.zip", 0, 0); 
	return 0;
}

Conclusion :


Si vous avez des remarques, des questions des améliorations ou n'importe quoi laissez un maissage!

Codes Sources

A voir également

Ajouter un commentaire Commentaires
fagroud Messages postés 1 Date d'inscription samedi 1 décembre 2007 Statut Membre Dernière intervention 16 décembre 2008
16 déc. 2008 à 00:49
s'il vous plait aidez moi
je viens de faire mes premiers pas avec dev c++ , franchemant c'est un bon environnement pour prigrammer sauf moi j'ai l'habitude d'utliser le c sous dos
j'ai trouvé des difficultés à executer mes programmes qui d'aileurs sont bien compilé mais lors de l'excution j'ai un message d'erreur sous forme d'une fenêtre windows et l'execution s'arrete surtout lorsque je manipule les pointeurs avec reservation de la mémoire avec calloc
voici la source
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int *file;
int ar,ae,drapeau_aj,drapeau_sup,creer,choix,test,dmax;
void creafile(int *e, int *r, int *v,int n)
{

v=(int *)calloc(n,sizeof(int)))

(*e)=0;
(*r)=0;

}
int filevide(int *e,int *r,int drapeau)
{
int vide;
if((drapeau==1)&&(*e)==(*r)) vide=1;
else vide=0;
return(vide);
}
int filepleine(int *e,int *r,int drapeau)
{
int pleine;
if((drapeau==1)&&(*e)==(*r)) pleine=1;
else
{pleine=0;}
return(pleine);
}
void ajouter(int *r, int *v,int n)
{
int ajout;
printf("n Merci de preciser la valeur antiere a ajouter dans la file \n");
scanf("%d",&ajout);
v[(*r)]=ajout;
(*r)=(*r)+1;
if((*r)>=n)(*r)=0;
printf("\n valeur %d ajouter avec succes\n",ajout);
}
c'est la partie ou il ya un probléme
pourtant sous l'environnement dos le prigramme s'execute sans aucun probléme
votre aides s'il vous plait
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
24 mai 2007 à 12:39
Quand tu fais : rech = (CHAR *) malloc (len_argv1 + 1);
si len_argv1 vaut 10 par exemple, tu alloues 11 caractères donc de *(rech + 0) à *(rech + 10) ou en encore de rech[0] à rech[10] ; Donc si tu fais rech[len_argv + 1] = '\0' c'est équivalent dans l'exemple à rech[11] = '\0' !
Pour le timeout, 2 conseils : utilise select() pour ne pas bloquer sur recv() (ça te permettra de recevoir les données que lorsqu'il y'en a de disponible et de virer ton thread), et si tu veux détecter la fin de la transmission de la page utilise HTTP/1.0 à la place de HTTP/1.1, le serveur fermera la connexion une fois la page transmise.

Pour stdup() et calloc() les pages de manuels sont tes amies.
Enjoy,
Thaeron
sebastienmz Messages postés 139 Date d'inscription mardi 16 mai 2006 Statut Membre Dernière intervention 23 juin 2008
24 mai 2007 à 11:52
Donc je vais corriger tous ça mais je comprend pas je calcule la taille des argv et ensuit j'alloue l'espace COMPREND PAS si tu peut un peut approfondir le sujet des malloc car j'ai pas compris
strdup()ça fait un moment que l'on m'en parle mais j'ai pas vraiment compris
Calloc je connais le nom mais rien de plus
A les thread J'ADORE CA C'EST UNE DES MEILLEURS PARTIE DU C, mais en faite j'ai mis des thread pour avoire un time out sur la reception du contenu car quand je l'ai fait je n'étais pas sur une bonne ligne et certain packet prennais trop de temps a arriver.
Pour la requete je vais corriger ça toute suite
Pour linux je suis en multi boot avec aussi plusieur vmware et pour les man je fait GOOGLE man la fonction
je te remercie pour ton aide je vais corriger tout ça ce soire !
MERCI !!!
sebastienmz Messages postés 139 Date d'inscription mardi 16 mai 2006 Statut Membre Dernière intervention 23 juin 2008
24 mai 2007 à 11:39
Pour l'assembleur ce qui pourrais s'intéresser c'est les protection anti-debugger ou anti-machine virutelle dans du code en C si quelqu'un pourrait me renseigner ça serait sympa
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
23 mai 2007 à 22:37
Salut, j'ai porté ton code sous linux pour le tester.
Il est plein de maladresses (excusables vu que ça fait peu de temps que tu fais du C) mais aussi d'erreurs.
Je vais en détailler le maximum mais je vais sûrement en oublier (surtout que j'ai pas fini de tout corriger).
On commence avec le main :
rech = (CHAR *) malloc (len_argv1 + 1);
rech[len_argv1 + 1] = '\0';
(idem pour path)
C'est faux bien sûr ! tu écris au delà de ce que tu as alloué, la ligne correcte est : rech[len_argv1] = '\0';
Ensuite :
memcpy (path, argv[2], len_argv2);
path[len_argv2 + 1] = '\0';
sprintf (path, "%s.txt", argv[2]);
(passons sur le +1) a quoi ça sert de faire un memcpy() si ensuite tu écrases tout par sprintf() ? Pire ! tu as alloué pour la taille de argv[2] et tu écris 4 caractères de plus, donc tu débordes !
Puis un appel à resolv() en lui passant un const char*, or dans resolv tu as " gethostname (host, sizeof (host));" donc un coup de page de manuel et je vois que gethostname place le nom d'host dans la chaine qu'on lui file en premier paramètre soit ici un const ! Donc c'est très mal (sous linux ça plante le prog direct), en plus cette fonction (dans ton utilisation) est absolument inutile.

On arrive à la fonction connect () :
int re[MAX_RECV];
for (i = 0; i <= MAX_RECV; i++)
re[i] = 1;
Et bam un overflow de plus, si tu alloues x entiers, ils vont de 0 à x-1
donc la ligne correcte est for (i = 0;i < MAX_RECV; i++)
Ensuite tu copies des machins dans buffer:
memcpy (buffer, begin, strlen (begin));
Tu utilises memcpy() mais tu ne recopies pas le caractères '\0' signalant la fin de la chaîne du coup le strcat() suivant va planter.
Et si tu te dis "oui mais j'ai mis memset() à 0 avant" j'expliquerais après pourquoi tes memset() sont faux.
Bon après j'ai viré ton thread pendant le portage vu qu'il est totalement inutile, donc je ne sais pas si cette partie est buggée ou non.
Valgrind m'indique des problèmes dans ton parser mais il est un "peu" trop bordélique pour que je m'y penche.

Donc venons aux erreurs "pas grave mais presque" :
il faut utiliser sizeof() avec des tableaux que s'ils ne sont pas dynamiques, ce qui fait que rech = (CHAR *) malloc (len_argv1 + 1);
memset (rech, 0, sizeof (rech));
c'est faux car le sizeof() d'un pointeur c'est 4 (sur une architecture 32 bits). Donc tes memset() ne vont mettre à 0 que 4 octets.

Quelques conseils :
si tu veux vraiment mettre à 0 ta chaine allouée : utilise calloc() qui va le faire très bien (ça va malloc + memset). si tu veux dupliquer une chaine utilise strdup() qui malloc() + strcpy(). Lorsque tu veux copier une chaine n'utilise pas memcpy() mais strcpy() et tu n'auras pas à mettre le '\0' de fin de chaine manuellement. Si tu veux comparer des chaines, ne fait pas caractère par caractère dans un if, utilise strcmp() ou strncmp().

Si tu veux faire une chaine directement intialisée et dans laquelle tu ne copieras pas de données, ne fait pas : char begin[1000] = "GET /search?q="; qui gaspille la mémoire mais tout simplement char begin[] = "GET /search?q="; le compilo mettra la taille tout seul comme un grand.
Ne met pas plein de variables globales ! Les variables globales c'est mal ! Du moins en abuser c'est mal.
Ne déclare pas n'importe où tes variables, en C elles ont des places bien définies pour une portée qui est aussi bien définie donc c'est soit en début de fichier, soit en début de fonction, soit en début de bloc mais pas en plein milieux d'un bloc (cas de wsaData dans ton main).
Pour finir n'utilise pas des threads si elles ne servent à rien, si tu lances un thread c'est pour continuer ensuite l'exécution et non pour attendre qu'il se finisse pour ensuite continuer l'exécution.

Derniers conseils (plus larges) : use et abuse des pages de manuels (surtout qu'elles sont meme en français), passe à linux pour pouvoir utiliser valgrind par exemple, il te permettra de vérifier que ton programme fonctionne correctement sans des bugs cachés.
J'espère que tu n'as pas mal pris mes remarques/conseils/corrections et que tu vas nous mettre à jour ce code par une nouvelle version toute propre et exempte de bugs.
Je te souhaite bon code.
Enjoy,
Thaeron
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.