Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLIENT FTP WINSOCK (PROTOCOLE FTP)


Information sur la source

Catégorie :Réseau & Internet Niveau : Expert Date de création : 16/04/2004 Date de mise à jour : 16/04/2004 01:28:44 Vu / téléchargé: 13 199 / 2 888

Note :
8,67 / 10 - par 9 personnes
8,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (21)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
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

  • 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!!!!!
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!!!!

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de pouda le 16/04/2004 09:24:32

merci ca m'evitera d'acheter une version payante ftpexpret ou truc comme ca je te met 10/10

signaler à un administrateur
Commentaire de Mechanicman le 16/04/2004 09:54:08

Beau travail, malgré une interface très basique à développer :
2 cadres pour voir les fichiers du coté serveur et local

Plein de trucs encore ....mais vraiment pas mal.... Continue comme ça!

signaler à un administrateur
Commentaire de Mercury le 16/04/2004 10:26:13

Petit client FTP simple, mais efficace. Les fonctions sont "basiques" et j'espère bien que tu vas le faire évoluer (gestion de comptes FTP par exemple). 9/10 (la perfection n'est pas de ce monde, même si ta source s'en approche)  :-)

signaler à un administrateur
Commentaire de Mercury le 16/04/2004 10:27:44

J'allais oublier !!! ENFIN UNE SOURCE TRES BIEN COMMENTE !!! C kler et facile à comprendre. Merci pour le temps que tu as pris à commenter ta source !

signaler à un administrateur
Commentaire de pouda le 16/04/2004 13:00:22

exact merci pour les comentaire car les objet ne sont pas tres bien renommer..

signaler à un administrateur
Commentaire de pcpunch le 16/04/2004 13:31:24

Merci, d'accord pour l'interface, mais mon but en faisant ce code etait d'apprendre a utiliser le protocole ftp, et non de dev un client.

Sinon pour la gestion de compte, la multiselection de fichier, et le double affichage des fichier, cotés serveur et DD, c'est pas dur a faire!!

Si je devais Dev un client j'utiliserai deja un listview avec affichage de l'icone selon extention du fichier, etc.....

Peu étre que je vais m'y mettre, mais pour cette source elle ne sera pas modifier, car le but et plutot didactique!!!!!!!

++ et merci

signaler à un administrateur
Commentaire de DeadlyPredator le 16/04/2004 16:58:10

c bien mais ça pas très utile sous cette forme. Le mieux c'est de le mettre dans un module de classe car on peut en créer plusieurs instances.

signaler à un administrateur
Commentaire de CrazyHorse le 16/04/2004 23:53:07

J'aime bien ta source, je trouve les explications tres claire et precise.
Moi meme je suis en train de vouloir faire un client ftp, et je rencontre quelque problemes. j'ai fais en sorte que si le mot de passe n'ai pas accepté il en teste un autre, et là j'ai un pb c'est que des que je lance l'apli l'exe essai de se connecter alors que j'ai encore rien fait et rien chargé. Si tu as une explication se serrai vraiment kool de ta part.
En tout cas je vais bien regarder ton code pour m'en inspirer.

signaler à un administrateur
Commentaire de lionel4 le 17/04/2004 15:37:01

A cool je v pouvoir me passer de cet Inet de MERDEEEEEEEEE

Merci pcpunch :D

signaler à un administrateur
Commentaire de bubble44 le 17/04/2004 16:28:01

La meilleure source vb, de cet style c'est :

http://www.vbip.com/winsock/winsock_ftp_client_01.asp

serieux, c'est enorme.

signaler à un administrateur
Commentaire de krafi le 28/05/2004 03:01:44

salut tout le monde j'ai un petit probléme, quand j'essaye duploader un fichier de nimporte quel type, je me retrouve avec un fichier de 0 bytes sur le server ftp...

Si quelqu'un à une idée, ça pourrait m'aider merci

;)

signaler à un administrateur
Commentaire de Shiofure le 04/06/2004 19:54:13

Génial ! Merci =)
J'avais besoin de ça, vraiment,

!GE-NI-AL!

signaler à un administrateur
Commentaire de Shiofure le 06/06/2004 16:27:40

Je rectifie, c'est dommage que la focntion d'upload ne marche pas, les fichiers envoyés sont vides... :(:(

signaler à un administrateur
Commentaire de gom le 09/06/2004 10:59:33

Génial pour apprendre le protocole FTP sous Visual Basic.

Mais le problème est que l'upload ne fonctionne pas. Le fichier qui est copié sur le serveur est illisible.

Quelqun sait ou je peut trouver des sources pour uploader avec winsock?

Merci
a+

signaler à un administrateur
Commentaire de fred31300 le 15/12/2004 15:09:56

Question : Quand tu ferme un port FTP et que tu reconnecte après tu as une erreur j'ai la même en winsocks, est ce normal ?

signaler à un administrateur
Commentaire de azerty99_71 le 22/03/2005 19:54:18

tu dois avoir mal refermé ta connection winsock :
tu dois utiliser winsockftp.close avant de vouloir lancer une seconde connection vers un autre server ...

Personnelement, je n'ai pas d'erreurs quand je fais ça...

++

signaler à un administrateur
Commentaire de fasila le 20/05/2005 12:48:46

bravo pour le code que je trouve super, vu que j'en ai testé d'autre moins performants, mais le Hic c'est qu'il y'a quelques problèmes je les liste:
- le download ne marche pas chez moi (ce n'ai du côté serveur,car il marche avec un autre client (cristal ftp free) je crois que le problème vient de ton appli, où ? je sais pas
-Quand on lance l'exe sur une machine où VB et MSDN 1 & 2 ne sont pas installés, il te fait des réponces du genre (MSWINSCK.OCX non configuré, et autre bidules et ressources du même genre)
Alors si tu peux l'améliorer tu aiderais de pauvres nase en VB comme moi

signaler à un administrateur
Commentaire de DEADisDEADisDEAD le 28/05/2005 17:03:17

il y a un pb, connection en mode passive. ftpperso.free.fr apparament j'ai du mal a me connecter : Temp = Split(Temp(1), ","

signaler à un administrateur
Commentaire de fg85 le 09/06/2005 18:54:51

L'ocx que tu utilise pour le style, on à droit de le reprendre ? il est de toi ?

signaler à un administrateur
Commentaire de fg85 le 09/06/2005 18:59:50

C'est bon l'ocx est une source  de vbfrance ;-)

signaler à un administrateur
Commentaire de wassimez le 25/02/2008 17:06:48

Merci pour le code mais lorsque il fait upload le fichier sur le serveur il m'affiche l'erreur suivante:
opération n'est pas autoriser a ce stade!!!!!!!!!!!!
merci
WASSIM

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,296 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.