je ne comprends pas j'ai un pb aevc avec la ligne suivante:
if ( (strstr(BufferRead,"200 OK" ))==NULL )
qd je mets u e valeur supérieure à 200 je bogue, voici le source en entier ça pet être utile:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#ifndef FALSE
#define FALSE -1
#endif
#ifndef TRUE
#define TRUE 0
#endif
#define MaxBuffer 8192
/********************************/
/***** Variables globales *******/
/********************************/
unsigned char *BufferRead=NULL;
unsigned char *BufferWrite=NULL;
int sockdest=NULL;
FILE *fp=NULL;
/********************************/
/** Prototypes des Fonctions ****/
/********************************/
void quit(void);
void usage(void);
int parse_url (char *url,char *host,char *urlfichier,char *fichier);
/* On quitte proprement */
void quit(void)
{
if(BufferRead) free(BufferRead);
if(BufferWrite) free(BufferWrite);
if(sockdest) close( (long)(sockdest) );
if(fp) fclose(fp);
exit(0);
}
void usage(void)
{
printf("HttpGet v0.5 (03/04/2001) créé par Titan pour les serveurs de Mohic ;-)\n" );
printf("Utilisation: HttpGet <URL complète> [<Nom du fichier a sauvegarder>]\n" );
printf("Exemple: HttpGet http://packetstorm.securify.com/UN [...] BETA22.tgz /tmp/nmap-2.54BETA22.tgz\n" );
exit(0);
}
int parse_url (char *url,char *host,char *urlfichier,char *fichier)
{
char *ptr;
char target[255];
strncpy((char *)target,url,7);
if ( (ptr=strstr(target,"http://" ))==NULL )
{
printf("URL invalide, l'URL doit commencer par http:// \n" );
return FALSE;
}
if ( (ptr=strchr(url+7,'/')==NULL )
{
printf("URL invalide !! \n" );
return FALSE;
}
strncpy(urlfichier,ptr,255); /* On récupère le fichier avec le chemin de l'URL, à l'origine strncpy(urlfichier,ptr,199) */
strncpy((char *)target,url,255);/*à l'origine strncpy((char *)target,url,254);*/
ptr=strtok(&target[7],"/" );
strncpy(host,ptr,255); /* On récupère l'hôte *, à l'origine strncpy(host,ptr,199);/
if ( (ptr=strrchr(url,'/')==NULL ) /* On récupère un pointeur sur le dernier caractère / pour le nom du fichier */
{
printf("URL invalide !! \n" );
return FALSE;
}
strncpy(fichier,ptr+1,255); /* On récupère le fichier idem à l'origine j'avais strncpy(fichier,ptr+1,255); */
return TRUE;
}
int main(int argc,char **argv)
{
int port=80;
struct sockaddr_in csin;
struct hostent *svr;
long result;
int nbrecar;
size_t total;
unsigned char chemin[255]; /*l'origine à [200]*/
unsigned char fichier[255];/*l'origine à [200]*/
unsigned char host[255];/*l'origine à [200]*/
char *fich;
char *ptr;
if (argc<2 || argc>3) usage();
if ( (parse_url(argv[1], (char *)host,(char *)chemin,(char *)fichier))==FALSE )
{
quit();
}
if(!(svr =gethostbyname(host)))
svr = gethostbyaddr(host, 15, AF_INET);
if (!(svr))
{
printf("Hôte %s introuvable\n",host);
quit();
}
if (argc>2)
{
fich=argv[2];
}else fich=(char *)fichier;
if (BufferRead==NULL)
{
if ( (BufferRead=malloc(MaxBuffer+1))==NULL )
{
perror("malloc() Erreur" );
quit();
}
}
if ( (BufferWrite=malloc(512))==NULL )
{
perror("malloc() Erreur" );
quit();
}
sockdest = socket(AF_INET, SOCK_STREAM, 0);
if (sockdest < 0)
{
printf("Impossible d'ouvrir une Socket !!\n" );
printf("[ERREUR] Problème de Socket [ERREUR]\n" );
quit();
}
memcpy((caddr_t)&csin.sin_addr.s_addr, svr->h_addr, svr->h_length);
csin.sin_family = AF_INET;
csin.sin_port = htons(port);
result=connect(sockdest, (struct sockaddr *)&csin, sizeof(struct sockaddr_in));
if (result != 0)
{
perror("Connect() Erreur" );
quit();
}
sprintf(BufferWrite,"GET %s",chemin);
strcat(BufferWrite, " HTTP/1.0\n\n" );
write(sockdest, BufferWrite, strlen(BufferWrite));
fp=fopen(fich,"wb" );
if (fp==NULL)
{
printf("Impossible de créé le fichier %s\n",fich);
quit();
}
total=0;
nbrecar=read(sockdest,BufferRead,MaxBuffer);
if ( (strstr(BufferRead,"200 OK" ))==NULL )
{
printf("Impossible de télécharger le fichier\n" );
quit();
}
printf("Réception du fichier %s en cours !!\n",fich);
/* ptr=strstr(BufferRead,"Content-Type:" ); */
ptr=strstr(BufferRead,"\r\n\r\n" );
if (ptr)
{
total=nbrecar-(ptr+4-BufferRead);
nbrecar=nbrecar-(ptr+4-BufferRead);
nbrecar=fwrite(ptr+4,1,total,fp);
}
/* Réception du fichier */
while(1)
{
nbrecar=read(sockdest,BufferRead,MaxBuffer);
BufferRead[nbrecar]=0;
if (nbrecar==-1)
{
perror("read() Erreur" );
quit();
}
/* printf (">%s\n",BufferRead);
fputs(BufferRead,fp);
*/
nbrecar=fwrite(BufferRead,1,nbrecar,fp);
total+=nbrecar;
/*
{
printf("Echec sauvegarde dans le fichier\n" );
quit();
}
*/
printf("KOctets reçus: %ld\r",total/1024);
if(nbrecar<=0) break;
}
printf("%ld Octets(%ld KOctets) reçus\n",total,total/1024);
fclose(fp);
fp=NULL;
quit();
}
j'ai mis en commentaire les valeurs que j'avais à l'origine et que j'ai ensuite modifié, car je pensais qu'il y aurait des octets qui ne seraient pas lus
merci de votre aide.