Envoyer n'importe quel fichier, de n'importe quelle taille par winsock

Description

Ceci est un code servant à envoyer n'importe quel fichier de n'importe quelle taille par Winsock.
Le code sert à prendre un fichier a partir d'un autre ordi.
Ce code explique aussi :
- L'utilisation de winsock
- L'utilisation de CommonDialog
- La création d'une progressbar perso.
J'ai largement commenté le code et j'ai essayé d'etre clair, surtout pour les débutants.

Source / Exemple :


' Cette source explique comment telecharger un fichier d'un ordinateur distant, a laide de WINSOCK
' Ele utilise la methode des PACKETS (découpage des fichiers en parties d'une taille définie)
' Plus la taille des packets est grande, plus le transfert sera rapide, cependant, la stabilit sera réduite.

Option Explicit ' Declaration de variables obligatoire, pour eviter des erreurs

Dim Numero_Fichier As Integer ' Variable qui contiendra le nomero du fichier qu'on traitera sur le module distant
Dim Numero_Fichier2 As Integer ' Variable qui contiendra le nomero du fichier qu'on traitera sur le module local
Dim OUSTOCKER As String 'Variable qui contiendra l'emplacement local ou on stockera le fichier recu
Dim TitreFichier ' Declaration de variable qui contiendra le titre du fichier (ex : fichier.txt)
Dim TailleFichier As Long ' Variable qui contiendra la taille du fichier

Sub PrendreFichier(ByVal FICHIER As String, ByVal OUSTOCKERLEFICHIER As String)  ' Procedure d'envoi de fichier
 LocalSock.SendData "GET " & FICHIER ' On envoi la demande de reception du fichier
 OUSTOCKER = OUSTOCKERLEFICHIER ' OUSTOCKER prend le chemin du dossier on on mettra le fichier en local, une fois recu
 TitreFichier = Right(FICHIER, InStr(1, StrReverse(FICHIER), "\") - 1) ' On prend, dans le nom de fichier, de la droite jusqu'a ce quon tombe sur le \, et on garde tout ce qui est a droite, soit, le nom du fichier et son extension, sans le chemin
End Sub ' Fin de procedure

Private Sub Connect_Click() ' Se produit lors du click sur le bouton Connect (connecter)
 LocalSock.Connect LocalSock.LocalHostName, 20000 ' On connecte le socket local au socket distant, sur le meme port et le meme host, on devient CLIENT
 'NOTE : ici, on a connecter le socket local sur LOCALHOSTNAME (sur la machine locale), pour une utilisation a distance, remplacez-le par le nom dhote ou le IP de lordi distant
End Sub ' Fin de procedure

Private Sub DistantSock_ConnectionRequest(ByVal requestID As Long) ' Se produit lorsque le module distant recoit une demande de connection.
 DistantSock.Close ' On ferme lécoute pour pouvoir etablir une connexion
 DistantSock.Accept requestID ' on accepte la connection
End Sub ' Fin de procedure

Private Sub DistantSock_DataArrival(ByVal bytesTotal As Long) ' Evenement se produisant lorsque socket distant recoit des données...
 Dim Donnees_Recues As String  'Donnees_recues est la variable ou on stockera les données recues.
 Dim NomFichier As String ' Variable qui contiendra le nom du fichier a lire.
 Dim Buf As String ' Variable qui servira pour recuperer les octets du fichier
 DistantSock.GetData Donnees_Recues ' On stocke les données recues dans la variable Donnees_Recues
 If Left(Donnees_Recues, 3) = "GET" Then ' CONDITION - Si les 3 premieres lettres de la chaine recue sont GET (demande de fichier)
  Numero_Fichier = FreeFile ' On assigne un numero de fichier libre a Numero_Fichier
  NomFichier = Right(Donnees_Recues, Len(Donnees_Recues) - 4) ' Ici, on recupere le nom de fichier de la commande GET, pour cela, on prend tout depuis la droite et on enleve les 4 premiers caracteres (le GET et l'espace qui suit), et il nous reste le nom du fichier.
  Open NomFichier For Binary Access Read As #Numero_Fichier ' On ouvre le fichier pour le lire.
  DistantSock.SendData "PRET " & LOF(Numero_Fichier) ' On envoie la confirmation d'ouverture du fichier au module local, ainsi que la taille du fichier ouvert en octets, pour la barre de progression.
 ElseIf Donnees_Recues = "NXT" Then ' Si la condition précédente n'est pas remplie et que on a recu la comande de packet suivant...
  Select Case LOF(Numero_Fichier) - Seek(Numero_Fichier) + 1 ' On choisit en fonction des octets du fichier restants, qu'on n'a pas encore lus.
   Case Is >= 2048 ' Si la taille restante est uperieure ou egale a 2048
    Buf = Space(2048) ' Buf est le buffer, qu'on INITIALIZE (on le remplit despaces, 2048, dans ce cas, vous pouvez évidemment le modif)
    Get #Numero_Fichier, , Buf ' On recupere les 2048 caracteres du fichier suivants, dans la variable BUF.
    DistantSock.SendData Buf ' On envoie ce qu'on a recupéré au module local.
   Case Is < 1 ' Si tout le fichier a été lu
    Close #Numero_Fichier ' on ferme le fichier
    DistantSock.SendData "FIN" ' on envoie la comande de Fin de fichier
   Case Else ' Si toutes les conditions précédentes ne sont pas remplies (si la taille restante est >=1 et <2048)
    Buf = Space(LOF(Numero_Fichier) - Seek(Numero_Fichier) + 1) ' On initialize le buffer avec le nombre d'espaces corespondant au nombre de caracteres restant
    Get #Numero_Fichier, , Buf ' On recupere les caracteres restants du fichier dans la variable BUF.
    DistantSock.SendData Buf ' On envoie ce qu'on a recuperrer
  End Select ' fin de la selection
 End If ' Fin de condition
End Sub ' Fin de procedure

Private Sub Form_Load() ' Evenement se produisant lorsque la feuille (form), FORM1 est chargée.
 DistantSock.LocalPort = 20000 ' on met le port d'ecoute du socket distant a 20000
 DistantSock.Listen ' on le fait ecouter (attendre une demande de connxion), il devient SERVER
End Sub 'Fin de procedure

Private Sub LocalSock_DataArrival(ByVal bytesTotal As Long) ' Evenement se produisant lorsque socket local recoit des données...
 Dim Donnees_Recues As String  'Donnees_recues est la variable ou on stockera les données recues.
 LocalSock.GetData Donnees_Recues ' On stocke les données recues dans la variable Donnees_Recues
 If Left(Donnees_Recues, 4) = "PRET" Then ' CONDITION - Si les 4 premieres lettres de la chaine recue sont PRET (confirmation d'ouverture de fichier)
  Numero_Fichier2 = FreeFile ' On assigne un numero de fichier libre a Numero_Fichier
  TailleFichier = Right(Donnees_Recues, Len(Donnees_Recues) - 5) ' Ici, on recupere la taille de fichier de la commande PRET, pour cela, on prend tout depuis la droite et on enleve les 5 premiers caracteres (le PRET et l'espace qui suit), et il nous reste la taille du fichier.
  Open OUSTOCKER & "\" & TitreFichier For Output As #Numero_Fichier2 ' On cree le fichier ou on va ecrire.
  LocalSock.SendData "NXT" ' on envoie la demande de reception du packet suivant, puisqu'il n'y a pas de packet précedent, c'est le premier packet qu'on va recevoir.
 ElseIf Donnees_Recues = "FIN" Then ' si on recoit en revanche, la notification de fin de fichier...
  Close #Numero_Fichier2 ' On ferme le fichier
 Else ' Si on ne recoit ni la fin de fichier, ni la confirmation douverture, c'est qu'on recoit un packet (partie du fichier).
  Print #Numero_Fichier2, Donnees_Recues; ' On inscrit le packet dans le fichier ouvert
  'NOTE :  le ; a la fin, signifie qu'on ne va pas a la ligne, cette methode evite de stocker les packets dans une variable (en mémoire), ce qui accelere le telechargement, augmente la stabilité et les performances systeme
  '        De plus, les fichiers de type MP3, par exemple, peuvent etre lus pendant le telechargement !
  LocalSock.SendData "NXT" ' On demande le packet suivant
  Progress.Width = BGProgress.Width / TailleFichier * LOF(Numero_Fichier2) ' On met a jour notre progressbar perso :)
  Percent.Caption = Round(100 / TailleFichier * LOF(Numero_Fichier2)) & "%" ' On met le pourcentage a jour
 End If ' Fin de condition
End Sub ' Fin de procedure

Private Sub Prendre_Click() ' Evenement se produisant lors du clik sur le bouton PRENDRE FICHIER
 On Error Resume Next ' On empechre l'arret du programme lors d'une erreur
 If LocalSock.State = sckConnected Then ' Si le socket local est connecter (condition)
  With Cmd ' WITH sert a racourcir le code, a enlever le nom d'objet qu'on doit ecrire eu debut. On n'utilisera qu'un simple point (ex : bouton.visible devient .visible)
   .DialogTitle = "Choisir fichier" ' On met un titre a la boite de dialogue
   .CancelError = True ' Si l'utilisateur annule, une erreur se produit
   .ShowOpen 'On affiche la boite de dialogue
   If Err Then Exit Sub  ' Condition - si une erreur est detectee (l'utilisateur a fait "annuler"), on quitte la procedure, on n'execute pas tout le code restant dans celle-ci.
   PrendreFichier .FileName, InputBox("Tappez l'endroit ou stocker le fichier ex : C: ou C\Windows", "Chemin", "C:") ' On appelle la procédure PRENDREFICHIER (voir plus haut) en demandant ou enregistrer le fichier recu.
  End With ' Fin du WITH
 End If ' Fin de condition
End Sub ' Fin de procedure

Conclusion :


Laissez vos commentaires et ne soyez pas trop sévères :s, je n'ai que 14 ans et suis encore débutant en VB.

Si vous proposez une critique, essayez de donner une astuce pour y remedier. merci :)

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.