Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
877 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Pb de Broken Pipe en C (bsd) - Application FTP

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pb de Broken Pipe en C (bsd) - Application FTP

n°700360
Kantorovic​h
Méssieu il est l'heuwe..
Posté le 15-04-2004 à 16:37:08  profilanswer
 

Bonjour a tous,
je viens vous importuner sur ce merveilleux forum pour soliciter votre aide afin de résoudre un problème dont je ne parviens pas a trouver la solution idéale.
 
Explication: je code un serveur ftp sous freebsd, et j'ai un léger soucis avec une de mes fonctions de transfert de fichier (fonction RETR). En effet je ne vous apprendrai rien en vous disant que lorsqu'un client se connecte a un serveur ftp et qu'il rapatrie le fichier, il a la possibilité d'annuler le transfert. Soit, voici une partie du code de ma fonction de transfert:
 

Code :
  1. while((c = getc(pf)), !feof(pf))
  2.             {
  3.               if(i < buf)
  4.                 {
  5.                   buffer[i] = c;
  6.                   i++;
  7.                 }
  8.               else
  9.                 {
  10.                   if(write(cdtp, buffer, i) < 0)
  11.                     return(0);
  12.                   buffer[0] = c;
  13.                   i = 1;
  14.                 }
  15.             }
  16.           if(write(cdtp, buffer, i) < 0)
  17.             return(0);
  18.           close(cdtp);
  19.           return(1);


 
J'attire votre attention sur les deux appels a write présent dans mon code. En effet si le client annule le transfert de fichier, il détruit la connexion établie pour le canal de transfert et par conséquent il rend obsolète le descripteur de fichier (socket) cdtp... et malheureusement moi, j'essaye d'écrire dedans. Du coups mon application se termine avec un broken pipe! Comme vous pouvez le constater j'ai tenter de recuperer une valeur d'erreur avec le test si write < 0 mais sans succès. Toutefois je sais qu'il est possible d'utiliser la fonction select() afin de savoir si le socket est toujours présent et si il est pret pour l'écriture ou la lecture. Voici ce que j'ai essayé:
 

Code :
  1. while((c = getc(pf)), !feof(pf))
  2.             {
  3.               if(i < buf)
  4.                 {
  5.                   buffer[i] = c;
  6.                   i++;
  7.                 }
  8.               else
  9.                 {
  10.                   FD_ZERO(&wfds);
  11.                   FD_SET(cdtp, &wfds);
  12.                   if((retval = select(cdtp+1, NULL, &wfds, NULL, &tv)) > 0)
  13.                     write(cdtp, buffer, i);
  14.                   else if(!retval)
  15.                     return(0);
  16.                   else
  17.                     return(-1);
  18.                   buffer[0] = c;
  19.                   i = 1;
  20.                 }
  21.             }


 
Mais malheureusement lorsque j'annule le transfert de fichier j'obtiens toujours un broken pipe :( Je n'arrive pas a comprendre pourquoi, pourriez vous m'aider ?  
 
En vous remerciant,
Kantorovich.


---------------
Ya pas que le riz et les pates dans la vie, ya le bleh aussi.
mood
Publicité
Posté le 15-04-2004 à 16:37:08  profilanswer
 

n°700379
Taz
bisounours-codeur
Posté le 15-04-2004 à 16:52:47  profilanswer
 

 while((c = getc(pf)), !feof(pf))  
 
 
boom. t'as rien compris à feof
 
 
int c;
 
while( (c=getc(pf)) != EOF) { /*  */ }

n°700382
Kantorovic​h
Méssieu il est l'heuwe..
Posté le 15-04-2004 à 16:57:06  profilanswer
 

lol, écoute premièrement ca n'a rien a voir avec le problème pour lequel j'ai posté et deuxièmement, ca fonctionne tout à fait de la manière dont je l'utilisais (j'aurai eu le temps de m'en appercevoir je crois sinon :) )


---------------
Ya pas que le riz et les pates dans la vie, ya le bleh aussi.
n°700388
Taz
bisounours-codeur
Posté le 15-04-2004 à 17:01:14  profilanswer
 

à ben si ça a avoir. avec ton feof tu incapable de détecter quoi que ce soit. cette méthode est mauvaise car elle ne permet pas de détecter les erreurs d'E/S

n°700410
Kantorovic​h
Méssieu il est l'heuwe..
Posté le 15-04-2004 à 17:19:35  profilanswer
 

J'ai fais ta modification, mais ca n'a pas changé le problème d'écriture sur le socket lors d'un ABOR... je dois surement mal utiliser le select, et c'est précisement la dessus que je solicite votre aide.


---------------
Ya pas que le riz et les pates dans la vie, ya le bleh aussi.
n°700624
Kantorovic​h
Méssieu il est l'heuwe..
Posté le 15-04-2004 à 23:21:25  profilanswer
 

Personne n'a une petite idée pour mon problème ? :'(


---------------
Ya pas que le riz et les pates dans la vie, ya le bleh aussi.
n°700731
SoWhatIn22
Posté le 16-04-2004 à 08:57:30  profilanswer
 

je ne comprens pas pourquoi tu utilises la méthode 'write' et non pas la méthode 'send', qui me parait plus appropriée.
 
man 2 send:

Code :
  1. NOM
  2.        send, sendto, sendmsg - Envoyer un message sur une socket.
  3. SYNOPSIS
  4.        #include <sys/types.h>
  5.        #include <sys/socket.h>
  6.        int send(int s, const void *msg, size_t len, int flags);
  7. ...
  8. Le paramètre flags peut contenir une ou plusieurs des options suivantes
  9. ...
  10.        MSG_NOSIGNAL
  11.               demande  de ne pas envoyer de signal SIGPIPE d'erreur sur les sockets connectées lorsque le correspondant coupe la connexion.  L'erreur  EPIPE  est toutefois renvoyée.


 
je n'ai donc pas testé, mais soit tu utilises la fonction 'send', soit tu interceptes le signal SIGPIPE qui est envoyé à l'application, et qui provoque une erreur de type 'broken pipe' si aucun handler n'est déclaré.


Message édité par SoWhatIn22 le 16-04-2004 à 08:58:36
n°701300
Kantorovic​h
Méssieu il est l'heuwe..
Posté le 16-04-2004 à 17:24:01  profilanswer
 

En faite j'utilisais read et write car la fonction read permet de renvoyer 0 lorsqu'elle recoit un eof contrairement a recv. Mais merci pour l'info a propos du flag de send, je l'ignorai.
Pourrais tu dailleurs me dire comment/ou je pourrai me procurer les pages du man en francais?
 
merci.


---------------
Ya pas que le riz et les pates dans la vie, ya le bleh aussi.
n°701380
djdie
L'heure, c'est l'heure.
Posté le 16-04-2004 à 18:56:53  profilanswer
 

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Pb de Broken Pipe en C (bsd) - Application FTP

 

Sujets relatifs
Ouverture d'un fichier dans son applicationCréer son application windows
[Flash] Lancer une application depuis flashConfiguration serveur d'application de Dreamweaver avec FREE
Superposition et Layering pour une application MFCcommunication entre les plugins et le coeur d'une application POO
Ouvrir une application à l'interieur de la fenetre de mon navigateurOuvrir une application à l'interieur de la fenetre de mon navigateur
Comment savoir si une application Java est déjà lancéeApplication client/serveur
Plus de sujets relatifs à : Pb de Broken Pipe en C (bsd) - Application FTP


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR