Erreur de segmentation d'un simple client http sous linux !!

Résolu
nassimatique Messages postés 4 Date d'inscription mardi 9 mai 2006 Statut Membre Dernière intervention 8 mars 2007 - 7 mars 2007 à 12:27
nassimatique Messages postés 4 Date d'inscription mardi 9 mai 2006 Statut Membre Dernière intervention 8 mars 2007 - 8 mars 2007 à 17:24
#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

nassimatique Messages postés 4 Date d'inscription mardi 9 mai 2006 Statut Membre Dernière intervention 8 mars 2007
7 mars 2007 à 12:32
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
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
7 mars 2007 à 12:56
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 ?
3
nassimatique Messages postés 4 Date d'inscription mardi 9 mai 2006 Statut Membre Dernière intervention 8 mars 2007
7 mars 2007 à 13:43
oui c vrai !!
je lance mon pg de la façon suivante :
./a.out "http://www.google.com"
es c'est juste !!
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 mars 2007 à 00:17
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.
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nassimatique Messages postés 4 Date d'inscription mardi 9 mai 2006 Statut Membre Dernière intervention 8 mars 2007
8 mars 2007 à 17:24
oui c vrai mon ami !!!
peut tu me proposer une solution stp !!!
plz plz plz
3
Rejoignez-nous