Problème de Winsock, assez urgent :D

Asaiel Messages postés 37 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 21 septembre 2006 - 13 oct. 2005 à 18:58
Asaiel Messages postés 37 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 21 septembre 2006 - 14 oct. 2005 à 12:47
Bonjour,

J'utilise une appli vb6 sous windows xp pr lister les fichiers de mon serveur (distant) dans une textbox. Tant que je navigue dans des répertoires peu épais, aucun pbm, mais dès que je tente d'ouvrir des chemin comme c:\windows\system32, le transfert se lance un moment, puis s'arrête et je n'obtiens aucun résultat... J'ajoute que en locale, bien que l'appli soit un peu lente, aucun probleme. Mais des que le tout transite par internet, ca ne foncitonne plus....

Coté serveur:
Const SEPARATOR As String = "<FIN_DU_MESSAGE>"

On Error GoTo erreur2
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.getfolder(Right(Data, Len(Data) - 3))
For Each X In folder.subfolders
sck.SendData "053<DIR>" & X.Path: DoEvents
Next
For Each X In folder.Files
sck.SendData "053<FILE>" & X.Path: DoEvents
Next
sck.SendData "053" & SEPARATOR
Exit Sub

erreur2:
sck.SendData "0532"
coté client:
Const SEPARATOR As String = "<FIN_DU_MESSAGE>"
Static Buffer As String

If Mid(Data, 4, 1) <> "2" Then
Buffer = Buffer & Data
If RightB(Buffer, LenB(SEPARATOR)) <> SEPARATOR Then Exit Sub
Data = LeftB(Buffer, LenB(Buffer) - LenB(SEPARATOR))
Buffer = ""
For i = 0 To UBound(Split(Right(Data, Len(Data) - 3), "053"))
list = Split(Right(Data, Len(Data) - 3), "053")(i)
If list <> "" Then
typ = Split(list, ">")(0) & ">"
Form8.lstdir.AddItem typ & Split(list, "")(UBound(Split(list, "")))
End If
Next
Else
b = MsgBox("Le lecteur sélectionné est inaccessible.", vbInformation + vbOKOnly, "Erreur")
End If

Ce que je ne comprends vraiment pas, c'est que chaque fichier fait l'objet d'une procédure d'envoi, donc pourkoi est ce que ca se met à bloquer d'un seul coup.....

Voila, j'aimerais beaucoup terminer ce projet, je compte donc sur vous et vous remercie de votre aide....

3 réponses

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
13 oct. 2005 à 21:06
Salut
Le principe est bon.
Pour gagner en temps de transfert, rétrécit ton SEPARATOR en un simple Chr(0), caractère qui ne risque pas d'apparaitre dans tes données.
Revois éventuellement l'utilité du "053" final puisque derrière, tu mets de toute façon un SEPARATOR.
Il te manque un marqueur de fin d'envoi, pour que, côté réception, tu saches que l'envoi est terminé : <FIN> par exemple ou simplement Chr(1)


Côté réception, j'ai pas analyser toutes ces lignes, mais le "RightB (...)" n'est pas forcement adéquat (essaye en utilisant simplement les Right, Left et Len). Le plus simple est de stocker toutes les données dans une chaine, Buffer (Dim en Static, parfait) et de faire le découpage à la fin avec un simple Split :


Buffer = Buffer & Data
A_Traiter = ""
If Instr(Buffer, "<FIN>") <> 0 Then
' Recherche le FIN
i = InstrRev(Buffer, "<FIN>")
' Isole la chaine à traiter
A_Traiter = Left(Buffer, i)
' Et la supprime du Buffer
Buffer = Right(Buffer, Len(Buffer) - i - Len("<FIN>"))
' Traite les données
Dim Tablo() As String
Tablo = Split(A_Traiter, SEPARATOR)
... Suite du traitement
Chaque donnée du tableau de 0 à UBound(Tablo) ressemblera à :
053C:\Coucou\Le Fichier.txt053
(l'utilité des "053" ? surtout le dernier)
End If


Dans ton découpage de réception, petits bugs possible :
-1- Tu stockes les données bout à bout dans Buffer et ensuite tu travailles avec Data ! Attention à ne pas réutiliser "Data" comme une simple variable : C'est une variable qui appartient à la Sub : Peut poser problème.
-2- Tu surveilles si Buffer se termine par SEPARATOR
Ce n'est pas forcement le cas si le buffer est plein. Tu peux avoir plein de données et seulement la portion de la donnée qui suit mais pas en entier.
Donc surveille plutôt s'il existe un SEPARATOR dans ton Buffer (avec Instr)

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
Asaiel Messages postés 37 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 21 septembre 2006
13 oct. 2005 à 23:29
Bonjour jack et merci pour ta réponse si rapide et si bien expliqué, ca fait plaisir de pouvoir compter sur l'aide de programmeurs quand on debute....

J'essaye ca demain et je te tiens au courant

Encore merci

asaiel
0
Asaiel Messages postés 37 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 21 septembre 2006
14 oct. 2005 à 12:47
bonjour jack,

tout d'abord merci encore de ton aide :D

J'ai rééxaminé mon code par rapport à tes conseils, et je souhaiterais te poser les questions suivantes:


1°) Du coté envoi, Le SEPARATOR que j'utilise n'est envoyé qu'à la fin de la procédure, c'est à dire après avoir envoyé la liste des fichiers et dossiers du repertoire. Il s'agit donc bien d'un marqueur de fin de l'envoi?


2°) T'as raison, le 053 final ne servant à rien, je l'ai supprimé dans le traitement


3°) Le stockage dans le buffer et le traitement après (coté client): je crois que c'est ce que j'ai fait


4°) Tu as raison pour data, j'ai donc crée une nouvelle variable nommée newdata


5°) Come le SEPARATOR n'est envoyé par le serveur qu'a la fin de la procédure, il ne peut normalement pas se trouver ailleurs qu'à la fin du buffer.

6°) Par contre, se peut-il que le buffer soit plein, et donc ne contiennent donc pas du tout le SEPARATOR final, dans ce cas comment tester si le buffer est plein (d'ailleurs c koi la longueur maximum que peut accepter un buffer déclaré en STATIC String), de manière à le vider pour attendre l'envoi du SEPARATOR final?

Voila, j'espère que tu auras la patience de jeter encore u npetit coup d'oeil, en tout cas c vraiment sympa de t'être penché dessus
le nouveau code:

coté serveur:
Const SEPARATOR As String = "<END>"
On Error GoTo erreur2
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.getfolder(Right(Data, Len(Data) - 3))
For Each X In folder.subfolders
sck.SendData "053<DIR>" & X.Path: DoEvents
Next
For Each X In folder.Files
sck.SendData "053<FILE>" & X.Path: DoEvents
Next
sck.SendData "053" & SEPARATOR
Exit Sub

erreur2:
sck.SendData "0532"

coté client:
Const SEPARATOR As String = "<END>"
Static Buffer As String
If Mid(Data, 4, 1) <> "2" Then
Buffer = Buffer & Data
If Right(Buffer, Len(SEPARATOR)) <> SEPARATOR Then Exit Sub
newdata = Left(Buffer, Len(Buffer) - (Len(SEPARATOR) + 3))
Buffer = ""
For i = 0 To UBound(Split(Right(newdata, Len(newdata) - 3), "053"))
list = Split(Right(newdata, Len(newdata) - 3), "053")(i)
If list <> "" Then
typ = Split(list, ">")(0) & ">"
Form8.lstdir.AddItem typ & Split(list, "")(UBound(Split(list, "")))
End If
Next
Else
b = MsgBox("Le lecteur sélectionné est inaccessible.", vbInformation + vbOKOnly, "Erreur")
End If
0
Rejoignez-nous