Lenoiche | bonjour tt le monde
voila , j ai un projet en langage C ou je dois faire un browser web
mais lors de l execution , il me mets un message d error
"broken pipe"
je ne sais pas du tout a koa ca correspond
si vous pouviez m aider
Code :
- /*declaration des librairies*/
- #include<stdio.h>
- #include<netdb.h>
- #include<unistd.h>
- #include<string.h>
- #include<arpa/inet.h>
- #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;
- /*nom du host du serveur*/
- char nom_serveur[150];
- int port[100];
- char chemin[TAILLE+1];
- int rc;
- int main (int argc, char*argv[])
- {
- /*adresse de la socket*/
- /*sockaddr_in:structure d'adressage specifique au domaine AF_INET(internet)*/
- struct sockaddr_in serverSockAddr;
- /*description du host serveur*/
- /*struc hostent : Structure utilisée pour obtenir des informations concernant le serveur
- principalement son adresse IP ) */
- struct hostent *serverHostEnt;
- /*adresse du serveur */
- unsigned long hostAddr;
- sprintf(nom_du_serveur,argv[1]);
- sprintf(chemin , argv[2]);
- /*initialisé à 0 serveurSockAddr car b0 sert à mettre des 0 dans un bloc d'octets */
- bzero((void*)&serverSockAddr,sizeof(serverSockAddr));
- /*convertir l'adresse IP en entier long*/
- /*inet_addr sert à spécifier une adresse IP spécifique à utiliser*/
- host_addr=inet_addr(nom_du_serveur);
- if((long)hostAddr!=(long)1)
- /*bcopy :copie d'un bloc d'octets*/
- bcopy((void*)&hostAddr,
- (void*)&severSockAddr.sin_addr,
- /*sizeof renvoie la taille en octets de hostAddr*/
- sizeof(hostaddr));
- /*si on a donné un nom*/
- else
- {
- /*gethostbyname : retourne l'adresse IP correspondant à un hôte*/
- bcopy((void*)serverHostEnt->h_addr,
- (void*)&serverSockAddr.sin_addr,
- serverHostEnt->h_length);
- }
- /*host to network port*/
- /*htons : convertit un entier court depuis l'ordre des octets de l'hôte vers celui du réseau */
- serverSockAddr.sin_port=htons(port);
- /*AF_***:INET=internet*/
- serverSockAddr.sinFamily=AF_INET;
- /*Création de la socket*/
- socket_vers_serveur=socket(AF_INET,SOCK_STREAM,0);
- /*int socket(int domaine,int type,int protocol);
- -la famille qui représente le protocole utilisé , ici AF_INET pour TCP_IP utilisant l'adresse
- Internet sur 4 octets : l'adresse IP ainsi qu'un numéro de port afin de pouvoir avoir plusieurs
- sockets sur une même machine .
- -le type qui indique le type de service (orienté connexion ou non).Dand le cas d'un service
- orienté nconnexion comme c le cas ici ), l'argument type doit prendre la valeur SOCK_STREAM
- (communication par float de données)
- -le protocole qui permet de spécifier un protocole permettant de fournir le service désiré.
- dans le cas de la suite TCP/IP il n'est pas utile , on le mettra toujours à 0.
- -en cas d'erreur, la fonction socket() return -1 */
- /*requête de connexion*/
- connect(socket_vers_serveur,(struct sockaddr*)&serverSockAddr,
- sizeof(serverSockAddr));
-
- /*-socket_vers_serveur représente la socket précédemment ouverte (la socket à utiliser)
- -serverSockAddr représente l'adresse de l'hôte à contacter.pour établir une connexion, le
- client ne nécessite pas de faire un bind()
- -la fonction connect() retourne 0 si la connexion s'est bien déroulée, sinon -1 */
- */
-
- /*construction de la requête HTTP*/
- sprintf(buffer,"GET%sHTTP/1.1\r\n"
- "Host:%s\r\n"
- "\r\n"
- ,chemin,nom_du_serveur);
-
- /*envoiede la requête HTTP*/
- send(socket_vers_serveur,buffer,strlen(buffer)+1,0);
- /*buffer représente un tampon contenant les octets envoyés au clients
- (on adapte le buffer en fonction du nombre d'octets envoyés)
- strlen: retourne la taille du buffer et strlen(buffer)+1 représente le nombre d'octets
- à envoyer*/
-
- /*reception de la réponse */
- do {
- rc=readnet(socket_vers_serveur,buffer,TAILLE);
- if(rc> )buffer[rc]=0x00;
- printf(buffer);
- } while (rc>0);
-
- /*fermeture de la connexion*/
- shutdown(socket_vers_serveur,2);
- /*la fonction shutdown() permet la fermeture d'un socket dans un des deux sens (pour une connexion
- full_duplex)
- ex : intshutdown(int socket,int how)
- si how=0, la socket est fermée en reception
- si how=1, la socket est fermée en émission
- si how=2, la socket est fermée dans les deux sens */
- close (socket_vers_serveur);
- /*la fonction close () permet la fermeture d'un socket en permettant au système d'envoyer les
- données restantes(pour TCP)*/
- return 0;
- }
- /*close() comme shutdown() retournent -1 en cas d'erreur, 0 si la fermeture se déroule bien */
- int readn(int fd, char *ptr, int n )
- {
- int nl, nr;
- nl=n;
- while (nl>0){ nr=read(fd,ptr,nl);
- if (nr<0)
- /*erreur*/
- return nr;
- else
- if (nr==0)
- break;
- nl-=nr;
- ptr+=nr;
- }
- *ptr=0x00;
- return(n-nl);
- }
|
MERCHI BCP |