Client ftp winsock (protocole ftp)

Description

Ci joint un petit client ftp fais avec winsock!!!

Il est très basic, mais après plusieurs essaie avec inet infructueux !!! et surtout les contraintes comme l'impossibilité d'utiliser des chemins de fichiers ou mm des noms de fichiers avec espace dans la ligne de commande "Execute GET ou PUT", je me suis mit a étudier la RFC FTP et utiliser WInsock pour mes opérations sur ftp!!!

Après Test, je trouve winsock plus stable et moins contraignant bien que plus compliqué que inet !!!

Ci joint une capture et le projet VB!!!!

Ci dessous qq. Explications sur le fonctionnement de mon appli et du protocole FTP, je dis explications en toute modestie et non "Tuto!!!!"

Si vous avez des questions ou si vous avez vu une erreur de ma part "Personne n'est parfais!!!", signalez le moi!!!!

les Commandes utilisées : Renomer (dossier ou fichier), liste des fichiers, cretaion de dossier, suppression de dossier, Téléchargement Envoie de fichier avec Progress bar.

Le code est a améliorer, comme par exemple la supression de dossier non vide ou les opérations sur plusieurs fichiers etc.... mais c'est déja une bonne base je pense ? pour un client Ftp Maison...

Source / Exemple :


1. CONNECTION ET IDENTIFICATION

On Utilise un ctrl winsock : SckFtp envoie les commandes et réceptionne la réponse serveur)

       SckFtp.Connect "Serveur ftp", "Port en général 21"

On envoie les commandes pour s'identifier avec la socket SckFtp

       SckFtp.SendData "USER " & Login & Vbcrlf
       SckFtp.SendData "PASS " & Password & vbCrLf

On envoie la demande de connexion en mode Passif

       SckFtp.SendData "PASV" & vbCrLf
 
2. RECEPTION REPONSES SERVEUR

   On recupére les réponses serveur dans le sckFtp (Evénement Data_Arrival)

                Dim TxtRecu as string
	SckFtp.GetData TxtRecu , VbString
	

 Attention la réponse renvoyé peu être multi ligne donc il faudra découpé 
La variable TxtRecu avec un split sur le chr(10) 
dans un tableau par exemple!!!

Les réponses sont sous la forme :

            215 UNIX Type: L8
            227 Entering passive mode (82,196,4,13,9,10)
            150 Connection established for the data.
            226-Fichiers utilises:      10/4000
            226-Volume utilise:    1401036/104857600
            226 Transfer ended

Lorsque le 4 éme caractère n'est pas un "-" alors c'est un code correspondant
a une réponse du serveur, sinon ce sont des commentaires. 

3. TRAITEMENT DES REPONSES SERVEUR

En fonction des codes reçus on fait une action, on analyse les 3 premiers caractère de TxtRecu (DataArrival de SckFtp)

  		
Ici à l'ouverture  de la connexion on attend l'acceptation du mode passif 
(Code 227) :

            227 Entering passive mode (81,191,4,13,9,10)

Et on extrait le port pour le transfert de données émit par le serveur.

Les 4 premiers chiffres entre parenthèse correspondent à votre IP 81.191.4.13
Pour connaître le port il faut extraire les 2 derniers chiffres entre 
Parenthèses ici : 9 et 10

Ensuite on multiplie le Premier par 256 et on ajoute le 2éme
Donc ici (9*256)+10 = 2314 est le port pour le sock des données 
(Réception texte, fichier ou envoie)

On a maintenant récupéré le Port, on va donc connecter le socket de données que l'on nome SckData
                
	SckData.Connect "Serveur", "Port dans cet ex : 2314)

Et avec le socket sckFtp on envoie la commande List

                SckFtp.SendData "LIST" & vbCrLf

Ensuite pour récupérer la liste de fichier il suffit de la récupérer dans le socket SckData (Evenement DataArrival)
	
	Dim StrString As String
    	SckData.GetData StrString, vbString, bytesTotal
	
StrString contient maintenant la liste des fichiers :

	
drwxr-xr-x   1 bob5959  bob5959        0 Apr 15 18:12 Dossier
-rw-r--r--   1 bob5959  bob5959        1 Apr 15 15:50 azer.jpg
-rw-r--r--   1 bob5959  bob5959    20993 Apr 15 15:52 demande movie.doc
-rw-r--r--   1 bob5959  bob5959    16384 Apr 15 15:57 demande movie2.doc
-rw-r--r--   1 bob5959  bob5959    16384 Apr 15 15:57 image19(51).JPG
-rw-r--r--   1 bob5959  bob5959    94534 Apr 15 16:06 image6(27).JPG
-rw-r--r--   1 bob5959  bob5959    46090 Apr 15 15:17 interface.jpg
-rw-r--r--   1 bob5959  bob5959     8192 Apr 15 16:02 menudiapo(11).jpg
-rw-r--r--   1 bob5959  bob5959    16384 Apr 15 15:51 Sans titre.JPG

Autorisation	                 Taille    Date     Fichier/dossier
			
Ensuite il est facile d'extraire les données utiles pour le soft

Il est important de récupérer les noms de fichier avec leur taille, 
en vu d'un téléchargement!

J'ai donc stocké chaque taille respectivement dans un tableau et chaque nom est affiché dans un listbox

Pour les dossiers je rajoute un "/" devant.

Pour les autres cas, l'action effectué sera en fonction du code envoyer par le serveur, Exemple :

On envoie la commande Mkd (Création d'un nv dossier sur le serveur) avec SckFtp

                SckFtp.SendData "Mkd Nouveau Dossier"  & vbCrLf

Réponse dans l'évenement DataArrival de SckFtp
			
	257 Ok

Alors on relance la commande LIST afin de réafficher la liste des fichiers....

ETc.....

PS : Les commandes sont disponibles dans la RFC (Français)
http://www.eisti.fr/res/res/rfc959/959-4_inter_fr.dim?session=101609#4.1.2

TELECHARGEMENT
==============

Dans mon code j'utilise la sock : SckDl

Il faut utiliser la commande "RETR" que l'on envoie avec SckFtp

Mais auparavant il faut définir le Type 
	
	SckFtp.SendData "TYPE I" & vbCrLf

Ensuite on attend la réponse du serveur (DataArrival de Sckftp)

	200 Set Type I

Et on connecte la socket Sckdl au serveur et au port, et on envoie la commande RETR (Téléchargement)
                    
	SckDl.Connect "Sereveur", "Port (2314)"
	SckFtp.SendData "Retr " & Fichier.ext & vbCrLf

Le serveur renvoie dans la SOcket SckFtp :

	150 Connection established for the data.

	226 Transfer ended

Le fichier arrive dans la socket SckDl (Evenement dataArrival) et on stocke le fichier dans StrBuffer
		
	Dim Temp As String
    	SckDl.GetData Temp
    	StrBuffer = StrBuffer & Temp	

Et on vérifie si la taille de buffer est égal a la taille du fichier télécharger,
Si c'est le cas alors le téléchargement et terminé, et on écrit le fichier
La Taille (TailleFic) à été récupérer dans le tableau en traitant la commande LIST

	If Len(StrBuffer) = TailleFIc Then
	Open "c:\fichier Télécharger.ext" for output as #1
        	Print #1, StrBuffer
       	Close #1
	SckDl.close 'on ferme le sock
	End if

	

UPLOAD
======

Dans le code j'utilise la sock : Sckup

Il faut utiliser la commande "STOR"

Mais auparavant il faut stocker le fichier dans le buffer (StrBuffer), pour cela on l'ouvre en mode binaire :

Open "Le fichier a envoyer.ext " For Binary Access Read Lock Read Write As #1
StrBuffer = Input(LOF(1), #1)
Close #1

Ensuite on envoie la commande STOR au serveur avec la sckFtp :

SckFtp.SendData "STOR " & 'Nom du fichiers dur le serveur.ext' & vbCrLf
	
Et on connecte la sock sckup au serveur :

SckUp.Connect "Serveur", "Port (2314)"

Ensuite des que la sock sckup est connecté, on envoie le fichier qui se trouve dans le Buffer(StrBuffer):

SckUp.SendData StrBuffer & vbCrLf
	
Dans l'événement SendProgress de la sock sckup , bytesRemaining permet de récupérer l'avancement :

Label1= Len(StrBuffer) - bytesRemaining

Et Pour savoir si l'envoie est terminé :

If bytesRemaining = 0 Then
      sckUp.Close 'On ferme la sock
      Msgbox "Envoie terminé..."
End if

	
Pcpunch!!!!!

Conclusion :


Ps : Durand je télécharge certain fichier (en général les fichier plus de 200Ko), j'ai une erreur "502 Fichier non ouvert" qui revient du serveur!!!

Apres plusieurs tentatives de déboguage, j'ai testé avec mon client ftp "total commander" qui lui aussi me renvoie la mm erreur. Donc apparemment ce n'est pas le code qui est en cause mais plutôt le serveur FTP (Testé sur un ftp Ifrance)

Si qq sait pourquoi, ou si vous avez le mm problème alors qu'avec un autre client Ftp le problème ne se pose pas, faite le moi savoir SVP!!!!

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.