2017-10-05 9 views
0

J'essaye de télécharger un fichier sur un serveur FTP en utilisant des commandes brutes. Oui, je sais qu'il existe des programmes et des packages pour cela, mais le mien est une application embarquée sans luxe. Mon problème est qu'après avoir réussi toutes les commandes appropriées, je trouve que le fichier n'existe pas sur le serveur.Comment utiliser la commande FTP STOR brute

Voici ce que je l'ai fait:

  1. J'Etablissez une connexion socket de commande à mon serveur FTP sur le port 21 (Sock1) et recevoir message d'accueil (code 220)
  2. J'envoie "USER myusername" et recevoir le code de succès 331
  3. J'envoie "PASS mypassword" et recevoir un code de succès 230
  4. j'envoie "TYPE I" et recevoir un code de réussite 200
  5. J'envoie "PASV" et reçois le code de succès 227 avec 6 numéros.
  6. Je décode ces nombres en une adresse IP et un port. Ils ont l'air raisonnables.
  7. J'ai réussi à ouvrir une connexion de socket de données TCP à l'adresse et au port ci-dessus (Sock2).
  8. J'envoyer "STOR MyFileName" et reçoivent un code de succès 150.
  9. J'envoie succčs le contenu MyFileName à Sock2.
  10. Je ferme Sock2, puis Sock1.

Tout semble s'être bien passé, mais aucun fichier sur le serveur. Quelqu'un peut-il me dire ce que j'ai fait de mal?

Je connais le serveur Ok parce que je peux télécharger le fichier en utilisant divers programmes clients FTP (en utilisant la commande PUT).

+1

Cela semble principalement correct sauf que vous devez attendre que le serveur reconnaisse le transport réussi, c'est-à-dire à l'étape 10, fermez sock2, attendez le 226 du serveur et fermez ensuite sock1. Et peut-être aussi ajouter une commande de quitter, y compris attendre la réponse avant de fermer sock1. En dehors de cela, il se peut que votre mise en œuvre réelle diffère de ce que vous décrivez ici. –

+0

Vous aviez raison Steffen, en fermant sock2 d'abord et en attendant 226 l'a réparé. Si vous soumettez ceci comme une "réponse", je l'accepterai. – DontPanic

Répondre

2
  1. Je réussis à envoyer le contenu de myfilename à Sock2.
  2. Je ferme Sock2, puis Sock1.

Une fois le transfert effectué la connexion de données (sock2) doivent être fermés pour signaler la fin des données sur le serveur. Le serveur répondra alors avec une réponse 226 au client. Cette réponse doit être lue avant de fermer le canal de contrôle (sock1). Si sock1 et sock2 sont fermés presque en même temps comme fait ici, il peut arriver que le serveur note la fermeture du canal de contrôle (sock1) avant la fermeture du canal de données (sock2) et traite ainsi le transport de données comme abandonné.