Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le schèma en C de connexion FTP

Parcque la je suis a deux doigts de réussir...

Sujet résolu
    19 février 2006 à 2:50:36

    Bonne nuit a tous !

    Voila... je vous arcelle avec ca... mais j'y suis presque ... :lol:

    Bien voila le résultat actuelle :

    [S]220 (vsFTPd 2.0.3)
    [C]USER anonymous
    [S]331 Please specify the password.
    [C]PASS anonymous
    [S]230 Login successful.
    [C]SYST
    [S]215 UNIX Type: L8
    [C]PWD
    [S]257 "/"
    [C]TYPE A
    [S]200 Switching to ASCII mode.
    [C]PASV
    [S]227 Entering Passive Mode (127,0,0,1,224,44)
    [C]Connexion à 127.0.0.1 sur le port 57388
    [C]Connecté !


    Bon rapidement, il se connecte à 127.0.0.1 sur le port 21..
    Connexion en ASCII, puis on demande le PASV./
    Je reconstitue le port, et l'ip. ( Connexion à 127.0.0.1 sur le port 57388 )
    Mon deuxième socket se connect... et la c'est le drame ! :lol:

    Donc la raison de mon poste :
    C'est quoi le schéma de connexion à un FTP en C ??

    Voila ce que j'ai compris :

    1 Etape : On créé un socket avec l'adresse IP et le port qui se connect.
    2 Etape : On recoie le message de bienvenue ( 220 (vsFTPd 2.0.3) )
    3 Etape : On dialogue avec le FTP.

    4 Etape : On fais une demande de PASV. Le serveur nous répond avec son IP et le port sur lequel il veut que l'on se connecte.
    5 Etape : On Créé un nouveau Socket qui se connecte à cette adresse et ce Port.

    6 Etape : ??? On lui envoie un message Puis on ferme le socket ???

    7 Etape : On envoie sur le premier socket la commande LIST
    8 Etape : On recoit la liste des fichiers et dossiers


    Vert = Ce qui marche actuellement
    Rouge = Ce qui ne marche pas.

    Alors ai je bon ?? Y a t'il des erreurs ?
    L'étape 6 est la où je bloque .. Je n'ai pas testé d'envoyé un message, mais apprement j'ai lut sur le net, qu'il fallais envoyé par la socket numéro 2 qui vient de se connecter l'adresse du serveur et le port ( 127,0,0,1,244,44 ) et aprés on ferme le socket. Comme une invitation à laquel on répond pour que le transfere sur le premier socket continue ?

    Please ! Aidez moi !! :) J'y suis presque ... o_O


    EDIT : OK C'est bon ! J'ai trouvé et compris le fonctionnement !!! :lol:

    Enffet la solution est simple. A l'étape 6, il ne faut rien envoyer ! Il faut juste écouter !
    Mais il faut dire au premier socket, maintenant que le deuxième écoute, d'envoyer la commande LIST.

    Et la comme par magie on revoie un message 150 et 226 ^^

    Donc me reste plus qu'a afficher la liste des fichiers ... o_O
    Bon aller ... Je retourne a la peche au infos :lol:;)



    A bas non .. je vient de trouver :lol:

    Aller c'est réglé !! :p
    • Partager sur Facebook
    • Partager sur Twitter
      19 février 2006 à 9:37:42

      Mais un ftp c'est pas sur le port 21? :euh:
      • Partager sur Facebook
      • Partager sur Twitter
        19 février 2006 à 9:46:15

        Si mais tu peux spécifié un autre port ;)
        • Partager sur Facebook
        • Partager sur Twitter
          7 mars 2006 à 2:36:47

          Attention, la connexion est bien faite sur le port 21 !

          Ce que tu voie dans la console, c'est le port de connexion du Passif mode.

          Passif Mode : Sans rentrer dans les détails, tu demande au serveur où tu doit te connecter chez lui ( adresse IP et port )
          Donc le serveur ouvre un port et te demande d'aller sur ce port la ( d'ailleur c'est le principe de transpercage de firewall ^^ )
          Donc tu as un socket qui parle avec le port 21 pour poser les questions et envoyer les commandes, et un autre socket qui recoit les réponses du serveur à tes questions et commandes.

          Donc enffet le port que tu voie la, c'est le port de connexion en mode passif.


          A l'inverse, si tu est en mode actfi, c'est toi qui dis au serveur, où tu veux qu'il vienne se connecter.
          Pareil, tu lui donnera pas le port 21 ( remarque la tu pourrais peut etre ) mais un port au dessus du port 1024 ( tout les ports avant 1024 sont réservé pour d'autre applications standards ).

          j'éspère être clair. ^^
          • Partager sur Facebook
          • Partager sur Twitter
            7 mars 2006 à 7:50:26

            Tu nous passeras ton programme à la fin pour qu'on puisse s'en instruire ? :p
            • Partager sur Facebook
            • Partager sur Twitter
              7 mars 2006 à 21:43:57

              Ben c'est pas un soft trés légal ... mais je peut vous filer mon fichier moteurFTP.c

              Il contient 1 fonction pour lancer la connexion, une autre fonction pour dialoguer avec le FTP. Il support le mode actif et passif.

              Parcontre il ne gère que les comandes MKD, PWD CWD et LIST. Les autres options ne me sont pas utile dans ce projet la.

              Plustard, si j'ai toujours le courage, je vais tenter de faire un portage de FLashFxp pour linux :p

              Mais ca c'est loin encore !! ^^

              Ceci dis, si ca vous botte, je vous tiendrais au courant pour ce qui est du portage de flashfxp.
              • Partager sur Facebook
              • Partager sur Twitter
                9 mars 2006 à 10:18:24

                Aller, je suis chaud ...

                Je vous fais le schèma complet de connexion d'un client à un serveur FTP !! ^^ Sympas hun ?

                Bon aller c'est partis !

                Bon la première étape, que ce soit en passif mode (PASV) ou actif mode (PORT) il faut créé un socket.
                Ensuite faut lui renseigner l'adresse IP du serveur et le port. Bon pour le port je pense que 21 sera bien :lol:
                Pour l'adresse IP, faut passer par gethostbyname(). Cette fonction va résoudre le nom ( le nom peut aussi etre l'adresse IP ).
                Du coups, on peut faire connect().
                Une fois le connect(), faut effectuer un read().
                La vous devez recevoir un 220 Bienvenue sur mon serveur FTP Perso !
                Bon si c'est le cas, y a plus qu'a faire des write(), read() pour dialoguer !

                Donc vous faites un write(), et juste aprés un read() etc...
                Moi j'ai fais un boucle While(conActiv != 1) avec un read() au début et plusieurs write dans une boucle switch aprés lecture du code réponse du serveur (220,230,331,421 etc... ).

                donc on a eut 220, ok ! On envoie USER anonymous
                Il nous dis 331, pas de problèmes, PASS anonymous@zero.fr
                il nous dis 230 le pass est ok ... la c'est un peu comme vous voulez.
                Si vous désirez, vous pouvez demander le système : SYST
                il vous retourne un 215 avec l'os. Du coup, il est temps de demander où nous comme (PWD)
                Il nous retourne un 257 avec normalement "/", donc la racine.
                Ensuite, comme on va juste recevoir des caractères ( la liste des fichiers ) on passe en mode ASCII, donc TYPE A.

                Bon jusque la, du gateau !

                Maintenant, on va tomber sur un morceau un peu dur :euh:
                Non vous inquiété pas, ca va passer comme une lettre à la poste ! o_O
                Faites pas ces yeux la, je vous jusre ! :D
                Je préfère ca ! :)
                Oui bon ca va maintenant ! :colere:
                Ok ok .. on passe à la suite ! :p
                Hep ! .... non bon aller .. on oublie.

                Bon alors maintenant grace à notre TYPE A on recoit un 200.

                La c'est important ! On va décider si vous êtes soumis, ou si c'est le serveur qui est soumis. ( D'habitude qui est en dessous chez vous ? :lol: non pardon .. c'est une blague vaseuse )

                Donc SOIT(e) vous êtes soumis et vous utiliser le Passif Mode ( bien trouvé comme nom non ? ) donc la ben vous envouyer une commande PASV. Le serveur vous répond par un 227 si c'est ok. La vous devez récupérer la réponse.
                Entre ( ) vous trouverez tout ce qu'il faut pour aller chez lui ( perso je trouve ca pas trop sécuritaire, bref on s'en fou ).
                Bon vous l'auriez vue partout sur le net, les 4 premiers c'est l'ip de connexion, les deux derniers c'est le port.
                Alors pourquoi c'est en deux morceau le port ? On a autre chose a faire que de savoir pourquoi c'est comme ca, et pas autrement !
                Bon pour ce qui est de remplacer des virgule par des points, je n'explique pas ? Merci
                Pour le port, c'est pas plus dur, mais faut le savoir.
                On prend le premier nombre on le multiplie par 256 et on ajoute le deuxième nombre !
                Exemple : 10,108,25,42,12,23
                Bon ben l'ip c'est 10.108.25.42 et le port de connexion c'est 3095 ( de têtes messieurs, faut faire bosser les meninges. )

                Maintenant, il ne vous reste plus qu'a créé une nouvelle socket avec l'adresse du serveur pour IP et le port c'est celui que l'on as trouvé. Un petit gethostbyname puis le connect(). Si celui ci ne vaut pas -1 c'est que l'on est connecté.
                Y a plus qu'a demander, depuis le premier socket toujours connecté la liste des fichiers.
                Donc un petit write LIST et on recoit un 150, la le serveur s'appréte a nous donner la liste !
                La c'est notre deuxième socket qui va la recevoire. Et un petit 226, le transfère est fini !

                Facile hun ? C'est pour ca que vous verrez des tats de mecs se la péter en disant, Moi je, et enffet il ne font que du PASV mode.

                Mais comme toi lecteure tu n'est pas de ces gens la, tu vas tenter le mode actif ! ^^
                C'est un peu plus dur, je l'admet sans problèmes ! :-°


                Bon revenons un peu en arrière. On vient d'envoyer notre TYPE A ! A oui un 200 retourné part le serveur.

                Bon maintenant on décide de passer en mode actif !
                Ben vous savez quoi, ont va faire ce que le serveur as fais dans la version PASSIF, et lui vas faire ce que nous avons fais ! interessant le FTP un ? Moi j'adore !

                Aller, il est temps de passer à l'action !

                Bon, la première difficulté est de définir sont adresse IP RESEAU ! J'ai bien dis réseau ! pas de rebouclage ( 127.0.0.1)!
                Moi j'ai pas encore trouvé de solution. Je me tappe toujours l'adresse de rebouclage.

                Bon une fois que ca c'est fais, ( vous avez qu'a le faire à la main. Vous faite : char adresseIP[]="192.168.0.1" ) on doit s'occuper du port vous aimez aller a fond dans les choses, et vous générer un nombre àléatoire entre 1024 et 65535

                Bon maintenant, vous prenez l'ip, vous remplacer les points par des virgules. Pour le port, vous prenez le port vous diviser par 256 et vous sortez le modos ou un truc comme ca ( numPort % 256 ). C'est le reste de la division quoi.
                Et vous les placer à la fin de l'ip comme le serveur l'avais fais en PASSIF Mode.

                Et vous faite un write PORT xxx,xxx,xxx,xxx,yyy,yyy.
                Le serveur vous répondra qu'il est d'accord pour aller la, ( il se soumet ... :diable: enfin !!! :o non c'est un délire ! ) avec un jolie petit 200. Ca vous rappelle rien ? TYPE A qui vous ressort un 200.
                La parcontre je comprend pas la RFC(959) sur ce point la.. pk utiliser des nombres en double. C'est tellement plus chiant pour nous programmeur. Bref. Ca serai pas drôle sinon :lol:

                Bon, si on as un 200, c'est ok. On va donc crééer une socket avec l'adresse IP local et le port définie avant.
                He pas de blague, sinon le serveur ca se viander sur le port est pas ouvert. Le pauvre. :lol:
                ATTENTION c'est pas fini ! Avant de dire au serveur qu'il puisse venir, faut d'abord faire un blind() pour assier le port que vous avez chosis à votre adresse local.

                Maintenant vous pouvez lancer un listen() et envoyer sur le premier socket la commande LIST pour lui dire, vas y vient ! C'est toutvert !
                Si vous faites pas ca, c'est comme si vous invitiez un pote, vous lui dite entre dans ouvrir la porte.. Il va s'écraser le nez sur la porte. Pas cool pour le pote. Parcontre pour vous ca peut etre drole :p

                Bon trève de plaisanteries.

                Dans la vrai vie, vous n'ouvrez pas la porte comme ca, vous vérifier qui est la, et vous décider si il peut entrer ou pas ? Ben le FTP c'est pareil. Maintenant que vous lui avais dis de se connecter a vous il est temps d'accepter ca requete. Sinon ? Ben pareil, il s'écrase encore le nez sur votre porte !
                Donc une commande accept() et il se mettra à parler ! Normale il est soumis ! o_O Oui bon ca va ! Je voie vous êtes pas fan de la soumissions...

                Voila, la liste de fichier arrive aprés un 150 et se fini avec un 226 !


                Alors ? C'était dur ??? ^^

                Celui qui se la pète avec son Pasv vous pouvez l'envouyer chier avec votre PORT :p

                Petits trucs :

                Quand vous envoyez une commande avec write, vous pas oublier de simuler l'appuie sur entrer. Donc un \n à la fin de la ligne. Mais c'est pas tout. Les serveurs en général fonctionneront, mais certains resterais sans rien dire. Bhé oui, faut aussi un \r avant le \n.
                Donc par exemple : mkd /test/\r\n


                Pour ce qui est de définir le port en mode actif, je vous ai dis de générer un nombre etc...
                Mais si vous êtes une feignasse vous pouvez utiliser la socket pour générer ce nombre.
                Vous mettez le port à 0, et il sera généré au pif.

                Pour le problème de la commande 200 qui est solicité plusieurs fois, je vous conseile de faire une variable char d'une longueur de 5 caractères part exemple, et de placer dedans la commande en court d'execution. Comme ca selon la commande en cours, vous saurez si 200 est pour le PASV ou le PORT etc...


                Voila !!! :)
                • Partager sur Facebook
                • Partager sur Twitter

                Le schèma en C de connexion FTP

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown