katson42
Messages postés45Date d'inscriptionsamedi 28 avril 2007StatutMembreDernière intervention 3 décembre 2009
-
13 déc. 2007 à 17:13
katson42
Messages postés45Date d'inscriptionsamedi 28 avril 2007StatutMembreDernière intervention 3 décembre 2009
-
23 déc. 2007 à 12:58
Bonjour à tous,
dans le cadre d'un projet je dois réaliser un client FTP se connectant sur un serveur.
J'ai réussi à créer la connexion avec le serveur (en mode passif), à afficher le repertoire du serveur dans une listbox mais je n'arrive pas télécharger un fichier.
La commande RETR envoyée de mon client est acceptée par le serveur (access allowed) mais le serveur m'envoie une erreur : 425 Cannot open data connection.
Si quelqu'un pourrait m'aider ce serait super sympa, ce projet est très important pour moi (je suis etudiant).
Merci.
(Si vous voulez voir mon code, je peux vous l'envoyer en MP, ou par mail).
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 13 déc. 2007 à 18:39
Salut,
En général, tu ne peux pas réutiliser la même connexion de donnée que
celle que tu as utilisé pour afficher le repertoire, il faut en recréer
une nouvelle (renvoyer une commande PASV etc).
katson42
Messages postés45Date d'inscriptionsamedi 28 avril 2007StatutMembreDernière intervention 3 décembre 2009 13 déc. 2007 à 19:20
Merci des réponses.
aardman c'est pourtant ce que je fais, dans mon programme principal avant d'appeler ma méthode download je fais appel à la commande pasv.
la première fois j'utilise pasv puis list (ça marche)
après quand j'utilise pasv suivi d'une autre commande, la connexion échoue.
j'ai une autre question quand j'envoie la commande RETR (pour télécharger) le serveur me répond que tout se passe bien (file sent ok) mais je ne trouve pas le fichier sur mon dique local !!!
(est ce que la commande RETR crée le fichier sur le dique local toute seule, ou il y a un traitement à faire?)
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 13 déc. 2007 à 19:38
Salut,
Bien sur que non il ne crée aucun fichier, comment le serveur distant pour créer des fichiers sur ta machine ?
Le serveur t'a tout simplement envoyé le fichier sur ta connection de
donnée (celle que tu as ouverte juste avant de faire le RETR) et c'est
a toi d'ouvrir un fichier localement, et de copier tout ce que tu
recois sur ta connection de donnée dans le fichier.
katson42
Messages postés45Date d'inscriptionsamedi 28 avril 2007StatutMembreDernière intervention 3 décembre 2009 13 déc. 2007 à 20:33
Vous aviez raison, mon erreur était bien celle-ci, merci encore.
Par contre, j'ai un autre problème, la taille de mon buffer est de 8ko (taille maximale autorisée), donc si je récupère un fichier de taille superieure à celle de mon buffer celui ci est incomplet.
Ex : pour un fichier de 45ko sur le serveur j'en récupère seulement 5ko avec mon client.
Je pense créer une classe (temporaire) qui récupèrerait les buffers et les assemblerait pour reconstituer mon fichier mais je ne vois vraiment pas comment je pourrais m'y prendre.
katson42
Messages postés45Date d'inscriptionsamedi 28 avril 2007StatutMembreDernière intervention 3 décembre 2009 18 déc. 2007 à 11:31
SVP, personne n'aurait d'idée sur la façon dont je doit m'y prendre pour télécharger un fichier de taille supérieure à la taille de mon buffer. C'est important pour moi.
Merci.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 18 déc. 2007 à 12:12
Salut,
Ben faut faire une boucle, tant que tu recois des données tu les écris
dans ton fichier. Si on fait super simple, ca se résume a une boucle
while avec un recv() et un fwrite() dedant.
katson42
Messages postés45Date d'inscriptionsamedi 28 avril 2007StatutMembreDernière intervention 3 décembre 2009 19 déc. 2007 à 00:46
Ta solution marche parfaitement Aardman, merci.
Par contre il me reste un problème. J'utilise une méthode qui me retourne la taille du fichier à télécharger, cette taille me servira de paramètre d'entrée de la méthode Télécharger.
Le problème est que la connection de la socket de la methode Télécharger (connect (socket, (SOCKADR *)&m_Sin, sizeof(m_sin))) retourne -1 (donc pas de connection!!).
Je pense que ce problème est du au fait que les sockets utilisées dans toutes les méthodes (CWD, CDUP, LIST...) ne sont jamais fermées, mais si je les ferme dans les méthodes ça ne marche pas vu que l'initialisation se fait uniquement dans le constructeur de la classe.
Je peux montrer le code, parce que j'ai peur de ne pas être très clair.
katson42
Messages postés45Date d'inscriptionsamedi 28 avril 2007StatutMembreDernière intervention 3 décembre 2009 23 déc. 2007 à 00:29
Mon projet avance bien , jusqu'à présent j'arrive à télécharger et à uploader des fichiers ASCII et binaires mais j'aimerais améliorer mon programme. En effet lorsque je rentre l'adresse IP de mon serveur je le fais dans une EditBox (en tapant un point entre chaque champ de l'adresse) mais j'ai vu que sous VC++ 2005 il y avait un IP Address Control qui permettait de simplifier la saisie de l'adresse IP. J'aimerais savoir comment on peut extraire l'adresse IP de ce contrôle, j'ai essayé de le faire avec la méthode GetAddress() mais je n'y arrive pas, faut-il que je j'insère des points entre chaque champ de l'adresseou cela est-il fait par défaut?