Bonjour,

J'ai un petit problème pour faire mon programme,

J'arrive à me connecter sur un serveur ftp, me loger aussi mais pour récupérer la liste des fichiers j'ai un petit souci mon serveur FTP que j’au me dit 425 can’t open directory

Je vous passe le codage de mon appli qui a une fiche principale et une unité et aussi je n’ai pas que celui la de problème quand je clic sur le bouton connecter sans passer par le mode pas à pas mon pointeur pour récupérer les informations du serveur ne fonctionne pas correctement par contre en mode pas à pas sa fonctionne correctement


Quelques informations en plus :

J’arrive a me connecter et me loger mais quand je passe pour récupérer la liste des fichiers présent c’est la que sa ne veut pas j’ai regardé dans un de mes TP que j’ai fias en cour sur l’analyse de protocole FTP, j’ai aussi utilisé Telnet et FTP dans l’invite de commande et mon logiciel Client (FileZilla) pour les différentes façons de se connecter au serveur j’ai remarque quand j’utilise mon programme et Telnet je rencontre les même erreurs j’ai aussi regarder pour le mode passif et actif et aussi regarder de la documentation concernant les commandes FTP.
Avec la commande PORT ou PASV j’ai regardé et il fait n changement de port pour le transfert et je pense qu’il faut se reconnecter avec se nouveau port


Si quelqu’un pourrais m’aidez

Je vous remercie d’avance

Cordialement Arnaud

Codage :

FPClientFtp.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
//---------------------------------------------------------------------------
 
#ifndef FPClientFtpH
#define FPClientFtpH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
 
#include "UntClientFtp.h"
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TClientFtp : public TForm
{
__published:    // Composants gérés par l'EDI
TGroupBox *GpBoxConnexion;
TLabel *LblIp;
TEdit *EdtIp;
TLabel *LblLogin;
TLabel *LblPassword;
TEdit *EdtLogin;
TEdit *EdtPassword;
TLabel *LblPort;
TEdit *EdtPort;
TButton *BtnConnecter;
TButton *BtnDeconnecter;
TMemo *MemoMessage;
TButton *BtnFermer;
TStatusBar *StatusBarEtat;
TGroupBox *GpBoxFichier;
TMemo *MemoFichiers;
TButton *BtnListerFichiers;
void __fastcall BtnFermerClick(TObject *Sender);
void __fastcall BtnConnecterClick(TObject *Sender);
void __fastcall BtnDeconnecterClick(TObject *Sender);
void __fastcall BtnListerFichiersClick(TObject *Sender);
private:    // Déclarations de l'utilisateur
ClientFtp objClientFtp ;
int codeRetour ;
public:        // Déclarations de l'utilisateur
__fastcall TClientFtp(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TClientFtp *ClientFtp;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------



FPClientFtp.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 
#include <vcl.h>
#pragma hdrstop
 
#include "FPClientFtp.h"
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TClientFtp *ClientFtp;
//---------------------------------------------------------------------------
__fastcall TClientFtp::TClientFtp(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TClientFtp::BtnFermerClick(TObject *Sender)
{
Close() ; 
}
//---------------------------------------------------------------------------
 
void __fastcall TClientFtp::BtnConnecterClick(TObject *Sender)
{
/*Sauvegarder les paramètres pour la connexion*/
objClientFtp.EcrireAdresseIp(EdtIp->Text) ;
objClientFtp.EcrirePort(EdtPort->Text.ToInt()) ;
 
/*Etablir la connexion*/
codeRetour = objClientFtp.Connecter(EdtLogin->Text,EdtPassword->Text) ;
 
switch(codeRetour){
case 0 :
/*Connexion reussi*/
BtnConnecter->Enabled = false ;
BtnDeconnecter->Enabled = true ;
MemoMessage->Visible = true ;
MemoMessage->Text = objClientFtp.LirePtrBufferAccueil() ;
StatusBarEtat->SimpleText = "Connecté à " + EdtIp->Text +
" ; En tant que : " + EdtLogin->Text ;
GpBoxFichier->Visible = true ;
break ;
case -1 :
BtnConnecter->Enabled = true ;
BtnDeconnecter->Enabled = false ;
StatusBarEtat->SimpleText = "Impossible de se connecté à " + EdtIp->Text ;
break ;
case -2 :
BtnConnecter->Enabled = true ;
BtnDeconnecter->Enabled = false ;
MemoMessage->Visible = false ;
MemoMessage->Clear() ;
StatusBarEtat->SimpleText = "Login ou Password incorrect" ;
break ;
default :
BtnConnecter->Enabled = true ;
BtnDeconnecter->Enabled = false ;
StatusBarEtat->SimpleText = "Erreur Inconnue" ;
break ;
}
}
//---------------------------------------------------------------------------
 
void __fastcall TClientFtp::BtnDeconnecterClick(TObject *Sender)
{
/*Deconnexion*/
codeRetour = objClientFtp.Deconnecter() ;
 
if(codeRetour == 0){
/*Deconnexion reussi*/
MemoMessage->Clear() ;
MemoMessage->Visible = false ;
MemoFichiers->Clear() ;
GpBoxFichier->Visible = false ;
StatusBarEtat->SimpleText = "Non-connecté" ;
BtnConnecter->Enabled = true ;
BtnDeconnecter->Enabled = false ;
}
}
//---------------------------------------------------------------------------
 
 
void __fastcall TClientFtp::BtnListerFichiersClick(TObject *Sender)
{
objClientFtp.CmdNLst() ;
MemoFichiers->Text = objClientFtp.LirePtrBuffer() ;
}
//---------------------------------------------------------------------------



UntClientFtp.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
//---------------------------------------------------------------------------
 
#ifndef UntClientFtpH
#define UntClientFtpH
 
#include <vcl.h>
#include <winsock2.h>
//---------------------------------------------------------------------------
 
class ClientFtp {
private :
AnsiString adresseIp ; // Adresse IP du serveur
int port ; // Port de connexion au serveru FTP
AnsiString login ; // Nom d'utilisateur du serveur FTP
AnsiString password ; // Mot de passe de l'utilisateur
SOCKET descripteurSock ; // Numéro du descripteur de la socket
int descripteurSockSave ; // Sauvegarde du descripteur de la socket
char * ptrBufferAccueil ; // Stocke le message d'acceuil du serveur
char * ptrBuffer ; // Stocke les informations du serveur
int codeRetour ; // Code retour des fonction de la classe ClientFtp
public :
/*Construteur, Destucteur*/
ClientFtp(void) ; // Constructeur
~ClientFtp() ; // Destructeur
 
/*Connexion, Deconnexion*/
// Permet de se connecter au serveur FTP
int Connecter(AnsiString prmLogin, AnsiString prmPassword) ;
int Deconnecter(void) ; // Permet de se deconnecter du serveur FTP
 
/* Fonction permettant d'écrire les différents attributs*/
void EcrireAdresseIp(AnsiString prmAdresseIp) ;
void EcrirePort(int prmPort) ;
 
/*Fonction permettant de lire les différents attributs*/
char * LirePtrBufferAccueil(void) ;
char * LirePtrBuffer(void) ;
 
/*Différente commandes pour le serveur*/
char * CmdNLst(void) ;
} ;
 
//---------------------------------------------------------------------------
#endif


UntClientFtp.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
 
//---------------------------------------------------------------------------
 
 
#pragma hdrstop
 
#include "UntClientFtp.h"
 
//---------------------------------------------------------------------------
 
#pragma package(smart_init)
 
//---------------------------------------------------------------------------
 
ClientFtp :: ClientFtp(void){
/*¨Permet d'initialisé la dll pour la création de la socket*/
WSAData wsaData ;
WSAStartup(MAKEWORD(2,0),&wsaData) ;
ptrBuffer = new char [1518] ;
ptrBufferAccueil = new char [1518] ;
}
 
//---------------------------------------------------------------------------
 
ClientFtp :: ~ClientFtp(){
/*Permet de libéré l'accès au reseaux et d'annulé l'utilisation de la dll*/
WSACleanup() ;
delete [] ptrBuffer ;
ptrBuffer = NULL ;
delete [] ptrBufferAccueil ;
ptrBufferAccueil = NULL ;
}
 
//---------------------------------------------------------------------------
 
int ClientFtp :: Connecter(AnsiString prmLogin, AnsiString prmPassword){
/*Permet de se connecter au serveur FTP*/
/*Création de la structure sockaddr_in qui permet d'entrer les paramètres
de la socket*/
sockaddr_in adrServeurSock ;
 
/*Affectation des différents paramètres de la structure sockaddr_in*/
adrServeurSock.sin_family = AF_INET ;
adrServeurSock.sin_port = htons(port) ;
adrServeurSock.sin_addr.S_un.S_addr = inet_addr(adresseIp.c_str()) ;
 
/*Récupération du descripteur en créant la socket*/
descripteurSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) ;
descripteurSockSave = descripteurSock ;
 
/*Permet la connexion au serveur FTP*/
codeRetour = connect(descripteurSock, (sockaddr*) &adrServeurSock,
sizeof(adrServeurSock)) ;
if(codeRetour == 0){
recv(descripteurSock,ptrBufferAccueil,1518,0) ;
if(strncmp(ptrBufferAccueil,"220",3) == 0){
/*Permet l'authentification de l'utilisateur sur le serveur*/
/*Création des commandes d'envoie pour le serveur*/
login = "USER " + prmLogin + "\r\n" ;
password = "PASS " + prmPassword + "\r\n" ;
/*Envoie de la commande USER*/
send(descripteurSock,login.c_str(), strlen(login.c_str()),0) ;
recv(descripteurSock,ptrBuffer,1518,0) ;
if(strncmp(ptrBuffer,"331",3) == 0){
/*Envoie de la commande PASS*/
send(descripteurSock,password.c_str(), strlen(password.c_str()),0) ;
recv(descripteurSock,ptrBuffer,1518,0) ;
if(strncmp(ptrBuffer,"230",3) == 0){
codeRetour = 0 ;
}else{
codeRetour = -2 ;
}
}
}else{
codeRetour = -1 ;
}
}
return codeRetour ;
}
 
//---------------------------------------------------------------------------
 
int ClientFtp :: Deconnecter(void){
/*Permet de se deconnecter du serveur FTP*/
shutdown(descripteurSock,2) ;
codeRetour = closesocket(descripteurSock) ;
return codeRetour ;
}
 
//---------------------------------------------------------------------------
 
void ClientFtp :: EcrireAdresseIp(AnsiString prmAdresseIp){
adresseIp = prmAdresseIp ;
}
 
//---------------------------------------------------------------------------
 
void ClientFtp :: EcrirePort(int prmPort){
port = prmPort ;
}
 
//---------------------------------------------------------------------------
 
char * ClientFtp :: LirePtrBufferAccueil(void){
return ptrBufferAccueil ;
}
 
//---------------------------------------------------------------------------
 
char * ClientFtp :: LirePtrBuffer(void){
return ptrBuffer ;
}
 
//---------------------------------------------------------------------------
 
char * ClientFtp :: CmdNLst(void){
send(descripteurSock,"LIST\r\n", 6,0) ;
recv(descripteurSock,ptrBuffer,1518,0) ;
return ptrBuffer ;
}
 
//---------------------------------------------------------------------------
Pense aux balises de code le #