Pb de Broken Pipe en C (bsd) - Application FTP - C - Programmation
Marsh Posté le 15-04-2004 à 16:52:47
while((c = getc(pf)), !feof(pf))
boom. t'as rien compris à feof
int c;
while( (c=getc(pf)) != EOF) { /* */ }
Marsh Posté le 15-04-2004 à 16:57:06
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 )
Marsh Posté le 15-04-2004 à 17:01:14
à 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
Marsh Posté le 15-04-2004 à 17:19:35
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.
Marsh Posté le 15-04-2004 à 23:21:25
Personne n'a une petite idée pour mon problème ?
Marsh Posté le 16-04-2004 à 08:57:30
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 :
|
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é.
Marsh Posté le 16-04-2004 à 17:24:01
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.
Marsh Posté le 15-04-2004 à 16:37:08
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:
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é:
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.