Probleme de broken pipe

Probleme de broken pipe - C - Programmation

Marsh Posté le 23-03-2004 à 18:58:37    

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 :
  1. /*declaration des librairies*/
  2. #include<stdio.h>
  3. #include<netdb.h>
  4. #include<unistd.h>
  5. #include<string.h>
  6. #include<arpa/inet.h>
  7. #include<netinet/in.h>
  8. #include<sys/socket.h>
  9. #define TAILLE 4096
  10. void appli(char*f);
  11. int readn(int fd, char *ptr , int n);
  12. int socket_vers_serveur=-1;
  13. /*nom du host du serveur*/
  14. char nom_serveur[150];
  15. int port[100];
  16. char chemin[TAILLE+1];
  17. int rc;
  18. int main (int argc, char*argv[])
  19. {
  20. /*adresse de la socket*/
  21. /*sockaddr_in:structure d'adressage specifique au domaine  AF_INET(internet)*/
  22. struct sockaddr_in serverSockAddr;
  23. /*description du host serveur*/
  24. /*struc hostent : Structure utilisée pour obtenir des informations concernant le serveur  
  25. principalement son adresse IP ) */
  26. struct hostent *serverHostEnt;
  27. /*adresse du serveur */
  28. unsigned long hostAddr;
  29. sprintf(nom_du_serveur,argv[1]);
  30. sprintf(chemin , argv[2]);
  31. /*initialisé à 0 serveurSockAddr car b0 sert à mettre des 0 dans un bloc d'octets */
  32. bzero((void*)&serverSockAddr,sizeof(serverSockAddr));
  33. /*convertir l'adresse IP en entier long*/
  34. /*inet_addr sert  à spécifier une adresse IP spécifique à utiliser*/
  35. host_addr=inet_addr(nom_du_serveur);
  36. if((long)hostAddr!=(long)1)
  37. /*bcopy :copie d'un bloc d'octets*/
  38. bcopy((void*)&hostAddr,
  39.       (void*)&severSockAddr.sin_addr,
  40. /*sizeof renvoie la taille en octets de hostAddr*/
  41.       sizeof(hostaddr));
  42. /*si on a donné un nom*/
  43. else
  44. {
  45. /*gethostbyname : retourne l'adresse IP correspondant à un hôte*/
  46. bcopy((void*)serverHostEnt->h_addr,
  47.      (void*)&serverSockAddr.sin_addr,
  48.      serverHostEnt->h_length);
  49. }
  50. /*host to network port*/
  51. /*htons : convertit un entier court depuis l'ordre des octets de l'hôte vers celui du réseau */
  52. serverSockAddr.sin_port=htons(port);
  53. /*AF_***:INET=internet*/
  54. serverSockAddr.sinFamily=AF_INET;
  55. /*Création de la socket*/
  56. socket_vers_serveur=socket(AF_INET,SOCK_STREAM,0);
  57. /*int socket(int domaine,int type,int protocol);
  58. -la famille qui représente le protocole utilisé , ici AF_INET pour TCP_IP utilisant l'adresse  
  59. Internet sur 4 octets : l'adresse IP ainsi qu'un numéro de port afin de pouvoir avoir plusieurs  
  60. sockets sur une même machine .
  61. -le type qui indique le type de service (orienté connexion ou non).Dand le cas d'un service  
  62. orienté nconnexion comme c le cas ici ), l'argument type doit prendre la valeur SOCK_STREAM
  63. (communication par float de données)
  64. -le protocole qui permet de spécifier un protocole permettant de fournir le service désiré.
  65. dans le cas de la suite TCP/IP il n'est pas utile , on le mettra toujours à  0.
  66. -en cas d'erreur, la fonction socket() return -1 */
  67. /*requête de connexion*/
  68.    connect(socket_vers_serveur,(struct sockaddr*)&serverSockAddr,
  69.    sizeof(serverSockAddr));
  70.  
  71. /*-socket_vers_serveur représente la socket précédemment ouverte (la socket à utiliser)
  72.   -serverSockAddr représente l'adresse de l'hôte à contacter.pour établir une connexion, le  
  73.   client ne nécessite pas de faire un bind()
  74.   -la fonction connect() retourne 0 si la connexion s'est bien déroulée, sinon -1 */
  75.     */
  76.    
  77. /*construction de la requête HTTP*/
  78.   sprintf(buffer,"GET%sHTTP/1.1\r\n"
  79.   "Host:%s\r\n"
  80.   "\r\n"
  81.   ,chemin,nom_du_serveur);
  82.  
  83. /*envoiede la requête HTTP*/
  84.    send(socket_vers_serveur,buffer,strlen(buffer)+1,0);
  85. /*buffer représente un tampon contenant les octets envoyés au clients
  86.    (on adapte le buffer en fonction du nombre d'octets envoyés)
  87.    strlen: retourne la taille du buffer et strlen(buffer)+1 représente le nombre d'octets  
  88.    à envoyer*/
  89.  
  90. /*reception de la réponse */
  91. do {
  92.    rc=readnet(socket_vers_serveur,buffer,TAILLE);
  93.    if(rc> )buffer[rc]=0x00;
  94.    printf(buffer);
  95.    } while (rc>0);
  96.  
  97. /*fermeture de la connexion*/   
  98. shutdown(socket_vers_serveur,2);
  99. /*la fonction shutdown() permet la fermeture d'un socket dans un des deux sens (pour une connexion  
  100. full_duplex)
  101. ex : intshutdown(int socket,int how)
  102. si how=0, la socket est fermée en reception
  103. si how=1, la socket est fermée en émission  
  104. si how=2, la socket est fermée dans les deux sens */
  105. close (socket_vers_serveur);
  106. /*la fonction close () permet la fermeture d'un socket en permettant au système d'envoyer les  
  107. données restantes(pour TCP)*/
  108. return 0;
  109. }
  110. /*close()  comme shutdown() retournent -1 en cas d'erreur, 0 si la fermeture se déroule bien */
  111. int readn(int fd, char *ptr, int n )
  112. {
  113. int nl, nr;
  114. nl=n;
  115. while (nl>0){ nr=read(fd,ptr,nl);
  116. if (nr<0)
  117. /*erreur*/
  118.   return nr;
  119. else
  120. if (nr==0)
  121. break;
  122. nl-=nr;
  123. ptr+=nr;
  124. }
  125. *ptr=0x00;
  126. return(n-nl);
  127. }


 
 
MERCHI BCP

Reply

Marsh Posté le 23-03-2004 à 18:58:37   

Reply

Marsh Posté le 23-03-2004 à 19:10:40    

C'est a quel niveau dans ton code qu'il te met un "broken pipe" ?
Essaye déjà d'isoler l'instruction...

Reply

Marsh Posté le 23-03-2004 à 19:12:54    

ben j voudrais savoir c koi exactement broken pipe
je sais pas c koa comme genre d erreur
 
donc si kk1 pouvait m expliquer
merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed