Kantorovich Méssieu il est l'heuwe.. | 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 :
- while((c = getc(pf)), !feof(pf))
- {
- if(i < buf)
- {
- buffer[i] = c;
- i++;
- }
- else
- {
- if(write(cdtp, buffer, i) < 0)
- return(0);
- buffer[0] = c;
- i = 1;
- }
- }
- if(write(cdtp, buffer, i) < 0)
- return(0);
- close(cdtp);
- 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 :
- while((c = getc(pf)), !feof(pf))
- {
- if(i < buf)
- {
- buffer[i] = c;
- i++;
- }
- else
- {
- FD_ZERO(&wfds);
- FD_SET(cdtp, &wfds);
- if((retval = select(cdtp+1, NULL, &wfds, NULL, &tv)) > 0)
- write(cdtp, buffer, i);
- else if(!retval)
- return(0);
- else
- return(-1);
- buffer[0] = c;
- i = 1;
- }
- }
|
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.
|