[DEV-CPP]ARCHIVAGE DES LIENS D'UNE RECHERCHE SUR GOOGLE

cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014 - 22 mai 2007 à 12:15
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
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/42789-dev-cpp-archivage-des-liens-d-une-recherche-sur-google

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
Cyr62110 Messages postés 65 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 21 octobre 2009
23 mai 2007 à 12:30
Moi, je ne suis pas un fan des technologies du web. Oui je sais programmer en html, CSS et php mais bon c'est juste pour essayer de faire un site web. Sinon pour winsock, j'ai essayer pendant environ 1 mois, c'est de la que viennent mes connaissances. Aujourd'hui j'ai abendonner les sockets pour me remettre à la programmation local sans utiliser Internet, je tente d'apprendre l'ASM pour optimiser mes sources.
Bye
sebastienmz Messages postés 139 Date d'inscription mardi 16 mai 2006 Statut Membre Dernière intervention 23 juin 2008
23 mai 2007 à 11:52
en fait je programme depuis que j'ai 8 ans et comme je vais bientôt avoir 17 ça fera 9 ans que je programme j'ai commencer pas le pascal après le delphi pendant 3 ans (je continu) et après le vb et maintenant le C, j'aurais voulu faire cette source en objet mais je trouve que l'objet (ATTENTION VOUS NE SEREZ PAS D'ACCORD AVEC MOI) c'est de la merde c'est pour cela que je suis passé au C, par exemple ceux qui se prétende "PROGRAMMEUR EN C++ (with classes) et qui utilise des malloc a la place de new frenchement C'EST NULL COMME LES CLASSES. Quand même le concept objet est BIEN mais a l'application c'est plus simple mais l'objet pour mes programmes que j'ai fais en Objet me prend plus de ligne que un bon vieux programme en BON C (peut être que c'est moi je problème avec l'objet mais je suis complètement allergique a ce concepte). Parlons de winsock c'est pas si complique car dans mon travaille je code beaucoup avec winsock et donc j'ai l'abitude, c'est mon travaille (je suis apprenant en sécu informatique) qui ma appris le C, franchement je trouve winsock super simple ce que je trouve plus dure c'est les memcpy ou le glut, opengl
bon pour cette source elle a été faite en 6 heure !
mon vrais problème c'est pour le recv j'aimerais d'abord savoir la taille que je reçois et après je prend les données, cela a été mon vrais problème
et j'ai de la chance, regarder le code source des recherches sur google il y a des balises pour indiquer le début des résultats et la fin donc cette source a pas été si compliquée a réaliser!
Cyr62110 Messages postés 65 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 21 octobre 2009
22 mai 2007 à 17:23
Trés belle source mais bon t'as du pas mal t'aidé des sources sur le web car utiliser WinSock aprés moins d'un an de programmation faut avoir du courage.
Bon courage pour la suite.
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
22 mai 2007 à 12:15
C'est bien jolie :D Mais juste un conseil d'ami, utilise FormatMessage avec GetLastError au lieu d'utiliser un switch avec toutes les erreurs possibles, tu va épargner du temps et réduire un peu la taille du .exe

A+
Rejoignez-nous