Transféré de fichier par winsock

Résolu
tonyledragon Messages postés 173 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 13 décembre 2012 - 9 mai 2011 à 12:04
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 14 mai 2011 à 15:01
Salut a tous voila j'ai un serveur et un client je voudrais que le client transféré des document style document texte etc au serveur le probleme et que voila j'ai noter le lieu et la taille du fichier mais je ne sais pas comment m'y prendre pour faire le transfere donc voici mon code ci quelqu'un peut m'aider
'voici le client 
Private Sub Command1_Click()
Dim nom As String
Dim taille As String
If Winsock1.State = sckConnected Then
taille = FileLen(App.Path & "\Saves\1.rxdata") & "//"
nom = App.Path & "\Saves\1.rxdata"
Winsock1.SendData taille
Winsock1.SendData nom

End If
End Sub

Private Sub Form_Load()
Winsock1.Connect
Dim lieu As String
Dim taille As String
Dim wrd As String


End Sub

Private Sub Winsock1_Connect()
Text1.Text = "connecté"
End Sub


donc la simplement le client envoie les donnée ou se trouve le fichier a télécharge c'est simple jusqu’à la

apres voici le serveur
Private Sub Form_Load()
Winsock(Index).Listen 'serveur sur ecoute
End Sub

Private Sub Winsock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
 Winsock(Index).Close 'close connexion on relance la connexion pour uine noiuvelel connexion
    Winsock(Index).Accept requestID
    Load Winsock(Index + 1)
    Winsock(Index + 1).Listen
End Sub


Private Sub Winsock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim chaine() As String
Dim wrd As String
Dim nom As String
Dim taille As String
Winsock(Index).GetData wrd ' on recoi les donnée du joueur
MsgBox wrd
chaine = Split(wrd, "//") 'on demande de trier les donnée
End Sub


voila donc la je recepetion les donnée donc avec split je met la taille d'un coter et le lieu de l'autre ,donc le problème est comment avec c'est donnée transféré les donnée du client au serveur merci d'avance

11 réponses

tonyledragon Messages postés 173 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 13 décembre 2012 1
10 mai 2011 à 16:56
desolé pour le up de que je seraitcomment delet ou mdoifier les message je le ferait
voila mon avvancé j'ai trouvé comment faire le soucie et que mes donnée son pas tous arrive voici le code d'envoie
Private Sub Command1_Click()
Dim taille As String
Dim taille2 As String
If Winsock1.State = sckConnected Then
Fichier = FreeFile
taille2 = FileLen(App.Path & "\Saves\Admin-2.rxdata")
taille = Space(taille2)
Open App.Path & "\Saves\Admin-2.rxdata" For Binary As #Fichier
    Get #Fichier, , taille
    Winsock1.SendData taille
Close #Fichier
Winsock1.SendData taille
End If
End Sub

et voici mon code qui recoie
Private Sub Winsock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim chaine() As String
Dim wrd As String
Dim nom As String
Dim taille As String
Winsock(Index).GetData taille ' on recoi les donnée du joueuFichier FreeFile
Open App.Path & "\Admin-2.rxdata" For Binary As #Fichier
Put #Fichier, , taille
Close #Fichier
End Sub
voila donc mes donnée n'arrive pas toutes comment je peut faire ? merci d'avance
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 mai 2011 à 18:46
Salut

Voir réponse à cette <question récente>

Le principe des sockets multi-clients est bien celui que tu as utilisé, MAIS il ne faut pas fermer le socket qui reçoit la demande de connexion et en ouvrir un autre.
Lors d'une demande de connexion, tu charges un nouveau socket et tu connectes ce nouveau socket au client - tu laisses le socket qui était en Listen comme il est, sinon il te faudrait re-gérer les demandes de connexions sur ce nouveau socket = usine à gaz.
    Load Winsock(Index + 1)
    Winsock(Index + 1).Accept requestID

Quant à l'envoi des données, il faut :
- Lire le contenu du fichier sous forme binaire vers un tableau de Bytes
Voir Get
- Envoyer le tableau de bytes
Voir .SendData monTableau() ou .SendData monTableau(0), je ne sais plus
- Côté réception, ton programme devra compter le nombre de bytes reçus pour savoir si les données sont toutes arrivées ou s'il s'agit d'une nouvelle commande qui suivrait les données d'un premier envoi.

En gros, ta trame ressemblera à ça :
4012//C:\Toto\Saves\1.rxdata123456789...

4012// : facile à repérer, bien que ce chiffre tout seul pourrait ressembler à beaucoup d'autres (voir conseils du lien dont je parlais en tête)

C:\Toto\Saves\1.rxdata : Le nom de ton fichier, Ok, mais comment ton programme de réception saura que le nom est complet ? Il faut là aussi un séparateur pour préciser la fin de l'info

123456789... : Les bytes d'info correspondant au contenu de ton fichier. Seul un comptage pourra te dire quand les données seront terminées.

Pense aussi à deux choses :
-1- Les données transmises n'arriveront peut-être pas toutes en une seule fois (selon la taille du fichier) --> Penser à mémoriser les infos reçues avant de les traiter.
-2- Plusieurs commendes peuvent se suivre --> Faire un découpage propre des données reçues

Des tas d'exemples existent parmi les sources du site : prends des idées dedans.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
tonyledragon Messages postés 173 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 13 décembre 2012 1
9 mai 2011 à 21:08
Ok merci d'avoir prit le temps de répondre a mon problème juste je suis un petit débutant en vb6 donc je connait pas trop encore les commande peut tu me montre en script que je puis-je intégré a mon script avec explication je sais que je demande beaucoup mais bon si ses possible sa serait sympas sinon avec des code simple sa m'yra déjà grand merci pour ton coter technique mais bon malgré sa je sais faire techniquement mais pas en script mal heureusement . voila
0
tonyledragon Messages postés 173 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 13 décembre 2012 1
9 mai 2011 à 21:18
le code en haut n'est pas le code réel voici ce qui faut ajouter au serveur en dessous split(wrd ,"//")
taille = chaine(0)
nom = chaine(1)
voila le code et terminer comme sa apres me manque plus que savoir comment faire lenvoie et reception j'ai chercher mais probleme c'est que il explique pas leur code
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
10 mai 2011 à 10:42
C'est vrai que certaines sources ne sont pas toutes complètement commentées et expliquées, mais il y en a beaucoup qui traitent ce sujet (rechercher "winsock transfert fichier" parmi les sources sauf .Net)
C'est à toi d'essayer de les comprendre comment cela fonctionne.

Bien comprendre comment fonctionnent les Winsocks : comment arrivent les données :
- une grosse quantité de données qui arrive par paquets
Il faut donc traiter les données en dehors du DataArrival afin d'être sûr d'avoir toutes les données avant de les traiter --> mémoriser les données en attendant de les avoir toutes
- plusieurs petites données qui arrivent les unes derrière les autres.
Imaginer ce système de séparateurs pour pouvoir refaire le découpage des données à la réception, sans erreur possible.

Il y a les doc, l'aide de VB6 pour les composants, et il y a l'imagination.
0
tonyledragon Messages postés 173 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 13 décembre 2012 1
10 mai 2011 à 14:30
re j'ai fait plusieur rechercher j'ai trouvé un moyen de créer mon fichier 1.rxdata il me manque plus qu'une seul chose c'est de savoir comment envoyer les bytes dans le fichier donc je pense qu'il faut l'ouvrire mais j'y travaille peut tu m'aider sur ce point pour transfere des bytes d'un fichier a un autre ?
0
tonyledragon Messages postés 173 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 13 décembre 2012 1
10 mai 2011 à 14:34
j'ai trouve sa comme code qui puise ecrit en binaire
My.Computer.FileSystem.WriteAllBytes _
("C:\MyDocuments\CustomerData", CustomerData, True)
0
tonyledragon Messages postés 173 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 13 décembre 2012 1
10 mai 2011 à 15:16
j'ai trouvé comment ouvrire en binaire si sa s'ecrit comme sa c'est grace a ce code
Open "c:\autoexec.bat" For Binary As #1

mais après je ne c'est pas comment écrire dedans encore

HS : comment on suprime les poste ou les edite pour evite les up de moin de 24h ou 48h
0
tonyledragon Messages postés 173 Date d'inscription lundi 2 mai 2011 Statut Membre Dernière intervention 13 décembre 2012 1
11 mai 2011 à 11:56
Up svp personne peut m'aider ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
14 mai 2011 à 03:54
"mes donnée n'arrive pas toutes"
Je t'ai déjà expliquer comment faire ; voir message du mardi 10 mai 2011 à 10:42:06.

Puisqu'on sait que les données peuvent ne pas arriver en une seule fois, il faut les mémoriser et attendre que toutes les données soient là.
Pour savoir combien il y en a, il faut les compter et surtout, il faut que l'expéditeur ait dit combien il en envoie.
Donc, il faut structurer tes envois.
Tant que tu enverras des données comme ça, en vrac, tu n'arriveras à rien de bon.
Je t'ai donné un exemple dans <ce précédent message>
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
14 mai 2011 à 15:01
Lire aussi (et comprendre) <ce fil de discussion> traitant du même sujet
0
Rejoignez-nous