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

Soyez le premier à donner votre avis sur cette source.

Vue 4 290 fois - Téléchargée 344 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
Messages postés
1
Date d'inscription
samedi 1 décembre 2007
Statut
Membre
Dernière intervention
16 décembre 2008

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
Messages postés
202
Date d'inscription
vendredi 6 juillet 2001
Statut
Membre
Dernière intervention
31 octobre 2007

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
Messages postés
139
Date d'inscription
mardi 16 mai 2006
Statut
Membre
Dernière intervention
23 juin 2008

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 !!!
Messages postés
139
Date d'inscription
mardi 16 mai 2006
Statut
Membre
Dernière intervention
23 juin 2008

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
Messages postés
202
Date d'inscription
vendredi 6 juillet 2001
Statut
Membre
Dernière intervention
31 octobre 2007

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.