Erreur de segmentation d'un simple client http sous linux !! [Résolu]

Signaler
Messages postés
4
Date d'inscription
mardi 9 mai 2006
Statut
Membre
Dernière intervention
8 mars 2007
-
Messages postés
4
Date d'inscription
mardi 9 mai 2006
Statut
Membre
Dernière intervention
8 mars 2007
-
#include <stdio.h>
#include <netdb.h>
#include
#include <string.h>
#include
#include <netinet/in.h>
#include <sys/socket.h>
#define TAILLE 4096
void appli(char *f);
int readn(int fd, char *ptr, int n);
int socket_vers_serveur = -1;
char nom_du_serveur[100]; /* nom du host du serveur */
int port=80;
char chemin[100];
char buffer[TAILLE+1];
int rc;
int main (int argc, char *argv[])

struct sockaddr_in serverSockAddr; /* addresse de la socket */
struct hostent *serverHostEnt; /* description du host serveur */
unsigned long hostAddr; /* addr du serveur */
sprintf(nom_du_serveur,argv[1]);
sprintf(chemin,argv[2]);
/* initialisé à zéro serverSockAddr */
bzero((void *)&serverSockAddr,sizeof(serverSockAddr));
/* converti l'adresse ip 9.100.1.1 en entier long */
hostAddr = inet_addr(nom_du_serveur);
if ( (long)hostAddr != (long)-1)
bcopy((void *)&hostAddr,
(void *)&serverSockAddr.sin_addr,
sizeof(hostAddr));
else /* si on a donné un nom */
{
serverHostEnt = gethostbyname(nom_du_serveur);
bcopy((void *)serverHostEnt->h_addr,
(void *)&serverSockAddr.sin_addr,
serverHostEnt->h_length);
}
serverSockAddr.sin_port = htons(port); /* host to network port */
serverSockAddr.sin_family = AF_INET; /* AF_*** : INET=internet */
/* création de la socket */
socket_vers_serveur = socket(AF_INET,SOCK_STREAM,0);
/* requête de connexion */
connect(socket_vers_serveur,(struct sockaddr *)&serverSockAddr,
sizeof(serverSockAddr));
/* construction de la requête HTTP */
sprintf(buffer,"GET %s HTTP/1.1\r\n"
"Host: %s\r\n"
"\r\n"
,chemin,nom_du_serveur);
/* envoie de la requête http */
send(socket_vers_serveur,buffer,strlen(buffer)+1,0);
/* receptionde la reponse */
do {
rc = readn(socket_vers_serveur,buffer,TAILLE);
if (rc>0) buffer[rc] = 0x00;
printf(buffer);
} while ( rc > 0 ) ; 
/* fermeture de la connection */
shutdown(socket_vers_serveur,2);
close(socket_vers_serveur);
return 0;
}
int readn(int fd, char *ptr, int n){
int nl, nr;
nl = n;
while ( nl > 0 ) {
nr = read(fd,ptr,nl);
if (nr < 0 )
return nr; /*error*/
else
if ( nr == 0 )
break;
nl -= nr;
ptr += nr;
}
*ptr = 0x00;
return (n-nl);
}

5 réponses

Messages postés
4
Date d'inscription
mardi 9 mai 2006
Statut
Membre
Dernière intervention
8 mars 2007

quand j'essaye de compiler mon programme il m'affiche a chaque fois "erreur de segmentation". je suis debutnt dans la progrmmation plz help !!
merçi d'avance
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Qd tu essais de lancer ton prog il t'affiche "erreur de segmentation" ? tu peux pas lancer ton programme, s'il a pas été compilé...
Donc la compilation se passe bien. Comment lances tu ton programme ?
Messages postés
4
Date d'inscription
mardi 9 mai 2006
Statut
Membre
Dernière intervention
8 mars 2007

oui c vrai !!
je lance mon pg de la façon suivante :
./a.out "http://www.google.com"
es c'est juste !!
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
sprintf(nom_du_serveur,argv[1]);
sprintf(chemin,argv[2]);

=> tu utilises deux arguments et tu n'en fournis qu'un seul, et comme tu ne fais aucun test de la valeur argc, ca crash.
Messages postés
4
Date d'inscription
mardi 9 mai 2006
Statut
Membre
Dernière intervention
8 mars 2007

oui c vrai mon ami !!!
peut tu me proposer une solution stp !!!
plz plz plz