IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

FTP & lecture sur le canal de controle


Sujet :

Modules Perl

  1. #1
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut FTP & lecture sur le canal de controle
    Bonjour,
    je dois faire une projet en Perl qui est un simple client FTP en perl. Je ne peux pas utiliser le module Net:FTP et je dois donc faire tout "manuellement".

    J'ai presque fini mais je me heurte cependant à un problème qui peut etre très génant qui concerne la gestion messages du type 220 provenant du serveur.

    Prenons le cas de la connexion. Je prépare le socket, je me connecte et apres je dois m'authentifier. Je précise que je souhaite afficher tous les messages du serveur.

    Avant l'authentification, le serveur peut envoyer un message de bienvenue et je dois donc l'afficher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    connect(VERS_SERVEUR, $destination) || die("Connect: $!");
    autoflush VERS_SERVEUR, 1;
     
    $ligne = <VERS_SERVEUR>;
    afficher_reponse($ligne);
    $ligne = <VERS_SERVEUR>;
    afficher_reponse($ligne);
     
    print "login : ";
    $ident = <STDIN>;
    ...
    le sute n'est pas importante
    Comme vous pouvez le voir, je fais DEUX fois une lecture dans le socket apres la connexion car mon serveur FTP envoie DEUX lignes de bienvenue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (000002) 11/01/2006 16:58:25 - (not logged in) (192.168.1.11) > 220-BulletProof FTP Server ready ...
    (000002) 11/01/2006 16:58:25 - (not logged in) (192.168.1.11) > 220 Welcome to Tex's Personal Server
    Le problème réside dans le fait que si je me connecte sur un autre serveur qui a UNE ou 10 0000 lignes de bienvenue, mon programme ne marche plus.

    De quelle façon je peux gérer ces messages en provenance du serveur ?

    merci.

  2. #2
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut
    J'ai recu une réponse en message privé. Je la mets ici pour continuer la conversation:

    Citation Envoyé par Hide
    ta essayé dans un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @ligne = <VERS_SERVEUR>; 
    afficher_reponse(@ligne);
    je suppose que afficher_reponse fait appel a une fonction qui affiche une unique ligne. un for serait p-e envisageable

    La boucle "for" ne résoud pas mon problème car je ne sais pas en avance combien de ligne je devrai lire. Cela dépend du serveur et c'est donc variable.

  3. #3
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    essaie ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print while (<VERS_SERVEUR>);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print foreach (<VERS_SERVEUR>);

  4. #4
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut
    ça ne marche pas non plus:

    ca affiche tous les lignes puis le client se bloque ce qui est logique car il attend qu'un message soit écrit ds le socket.


  5. #5
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut
    alloo ?

    svp !! pas d'idées. ?

  6. #6
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    tu as droit à quels modules ?
    as-tu déjà lu ceci : perlipc ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    J'ai realise un client ftp en java et j'ai ete confronte au meme probleme que toi.

    En fait le protocole ftp prevoit cette ambiguite, ainsi on peut remarquer que lorsqu'une reponse est constituee de plusieurs lignes, la premiere ligne debute par "CodeReponse-MessageLigne1" et la derniere ligne debute par "CodeReponse MessageDerniereLigne".Quant aux lignes intermediaires, elles debuteront directement par le message (le protocole prevoit un espace supplementaire devant le code reponse dans le cas de reponses imbriquees).

    Tu peux consulter plus en detail la partie de la rfc sur ce sujet ici

    J'espere ne pas avoir ete trop embrouille , je ne suis pas encore assez doue en Perl pour te donner un exemple de code

  8. #8
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut
    je comprends ce que tu veux dire mais le problème est que le serveur n'envoie pas forcément une réponse multiligne "typée" qui commence et se finit par un message précis.

    le serveur envoie juste plusieurs lignes dont on ne peut pas connaitre le nombre ni le format en avance.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    on ne peut pas connaitre le nombre ni le format en avance.
    Tout à fait d'accord avec toi, mais le truc c'est que quand tu seras arrivé à la dernière ligne de la réponse, tu pourras le savoir, car celle-ci commencera par trois chiffres suivis d'un espace.

    Je vais essayer (j'ai bien dit essayé parce que bon je commence juste le perl.. ) de te mettre un petit bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # On lit les lignes de reponses du serveur
    while (<VERS_SERVEUR>) {
     
    	# On les affiche :
    	afficher_reponse($_);
     
    	# Si on est arrivé la derniere ligne, on sort de la boucle
    	# Expression régulière (trois chiffres suivis d'un espace, à vérifier)
    	if (/^\d\d\d\s/) {
    		last;
    	}
    }
    Voila j'espère que cela t'avancera un peu.

    le serveur n'envoie pas forcément une réponse multiligne "typée" qui commence et se finit par un message précis.
    Sauf erreur de ma part, tous les serveurs ftp connus que j'ai testé (FileZilla, BulletProof, Serveur ftp de free, ProFTPD), respectent la RFC FTP, et ainsi signalent une fin de reponse par une ligne débutant par trois chiffres suivis d'un espace.

    Bon courage pour la suite

  10. #10
    Membre régulier Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Points : 122
    Points
    122
    Par défaut
    C'est tout à fait ça et ça marche Yooupii

    Je n'avais pas vu que dans la derniere ligne il y a un espace apres les 3 chiffres ce qui la differencie des lignes précédentes. J'aurais dû lire mieux la RFC.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    220-BulletProof FTP Server ready ...
    220-Welcome to Tex's Personal Server
    220-Bla Bla
    220 Bla Bla
    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/05/2015, 17h34
  2. Erreur de lecture sur BD Access avec delphi
    Par e120650 dans le forum Bases de données
    Réponses: 1
    Dernier message: 10/06/2005, 10h17
  3. [C#] lecture sur port série
    Par Iokanaan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/05/2005, 13h50
  4. [Kylix] Lecture sur le port série en C++
    Par MD Software dans le forum EDI
    Réponses: 1
    Dernier message: 08/05/2004, 12h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo