myarouvb
Messages postés40Date d'inscriptionsamedi 11 novembre 2000StatutMembreDernière intervention 4 avril 2005
-
26 mars 2005 à 17:11
myarouvb
Messages postés40Date d'inscriptionsamedi 11 novembre 2000StatutMembreDernière intervention 4 avril 2005
-
28 mars 2005 à 21:08
Bonjour,
Je vous décris mon problème... J'envoie un fichier par winsock à partir d'un serveur vers mon client (une screenshot), voici mon code :
If (Left(cData, 10) = "SCREENSHOT") Then ' si les infos correspondent a une screenshot envoyée
Temp = Right(cData, Len(cData) - 10) ' je transfère les data dans une variable temp
If RcvSC = False Then ' si fichier non ouvert
Open App.Path & "\screenshot.jpg" For Binary Access Write As #2 ' ouverture du fichier
RcvSC = True ' fichier est ouvert
End If
If RcvSC = True Then ' si fichier ouvert
If Temp <> "END" Then ' si la donnée recue est différente de END (fin de fichier)
Put 2, , Temp 'Store the data to the file ' on stocke les données dans le fichier
Else
Close #2 ' on ferme le fichier
RcvSC = False ' fichier plus utilisé
End If
End If
Seulement, lorsque mon programme est toujours ouvert (je ne souhaite pas fermer la connexion winsock car elle recoit d'autres données pour d'autres raisons), il est impossible de pouvoir ouvrir la screenshot recue (bien que j'en vois l'apercu dans la partie gauche de l'explorateur window).
Est il possible que j'ai mal fermé le fichier? Quelqu'un a déjà eu ce pb?
Merci d'avance pour vos réponses!!
A voir également:
(WINSOCK) Problème d'accès à un fichier après écriture
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 26 mars 2005 à 17:58
lol, tout dépend la manière dont tu t'y prends avec tes entêtes, pas assez d'info pour te répondre. Tout dépend du "protocole maison" que tu as inventé.
Personnellement, dans mes comm à base de winsock, mes entêtes sont organisés comme ça :
- Pour les transferts de données texte standard :
TexteEntête & Chr(0) & Donnée1 & Chr(0) & Donnée2 & ... & Chr(1)
A la réception, Chr(1) sert de détecteur de fin de trame, et il n'y a plus qu'à découper la chaine de réception avec les Chr(0)
- Pour les transferts de fichiers :
TexteEntête & Chr(0) & NomFichier & Chr(0) & LongueurDesDonnées & Chr(0) & Données & Chr(1)
avec TexteEntête = "Fichier" Cas particulier
A la réception, quand je détecte cet entête, je récupère les le nom et la longueur et j'attends que toutes les données soient là avant de les enregistrer d'un seul coup dans un fichier.
Vala
Jack
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)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 26 mars 2005 à 17:37
Salut
A mon avis, ton transfert ne se termine jamais car il y a peu de chance que TEMP soit exactement égal à END puisque TEMP = aux données moins l'entête !
Va falloir revoir le découpage
Pour le transfert de fichiers, je te conseille d'ajouter après ton entête SCREENSHOT la longueur des données qui suivent pour t'en servir pour connaitre la fin de transmission.
Vala
Jack
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)
Vous n’avez pas trouvé la réponse que vous recherchez ?
myarouvb
Messages postés40Date d'inscriptionsamedi 11 novembre 2000StatutMembreDernière intervention 4 avril 2005 26 mars 2005 à 17:39
oui mais ya un soucis, si je fais un close après chaque put, il faut aussi que je rouvre à chaque fois le fichier pour y écrire des infos. Or, les infos ne seront plus mis en queue, elles vont écraser le contenu du fichier!
myarouvb
Messages postés40Date d'inscriptionsamedi 11 novembre 2000StatutMembreDernière intervention 4 avril 2005 27 mars 2005 à 01:54
mmhhh en fait j'ai encore une question jack!
Comment t'y prends tu pour effectuer tes transferts de (gros) fichiers?
Voici ma portion de code qui me permet d'envoyer la screenshot en question
Dim Screenshot As String
Dim BlockSize As Long
Dim SndSC As Boolean ' variable vérifiant si le transfert est en cours ("SeNDScreenShot")
BlockSize = 4000
Open App.path & "\screenshot.jpg" For Binary Access Read As #1
Do While Not EOF(1)
Screenshot = Space$(BlockSize)
Get 1, , Screenshot
If SndSC <> True Then
Winsock.SendData ("SCREENSHOT" & Screenshot)
SndSC = True
Else
Winsock.SendData ("SCREENSHOT" & Screenshot)
End If
DoEvents
Loop
Winsock.SendData "END"
Close #1
Dans ce cas précis, l'envoi de la donnée "END" marque bien la fin de fichier non?
Dans ton exemple, tu préconises de faire comme ceci :
TexteEntête & Chr(0) & NomFichier & Chr(0) & LongueurDesDonnées & Chr(0) & Données & Chr(1)
Mais ca ne fonctionnera pas en cas de gros fichier, si?
Beaucoup de questions je sais, mais ca m'aidera à mieux comprendre le fonctionnement de ce gros merdier
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 27 mars 2005 à 04:08
re
L'envoi de donnée n'est jamais un problème : le winsock expédie les données sans problème.
Pour résumer ce qui est expliqué cent fois sur ce même forum (...) la réception de grosses quantités d'infos ne se fait pas en une seule fois, mais par paquet d'environ 16ko = la taille du buffer d'un winsock.
Il faut donc mémoriser les infos qui arrivent au fur et à mesure avant de les traiter (c'est une possibilité. Pour savoir si toutes les données sont bien arrivées, il faut donc un marqueur de fin.Tu avais choisis d'ajouter END en fin de trame, Ok, mais tel que tu le testais, ça pouvait pas marcher : tu testes si Temp "END", Temp étant les données reçues, donc peu de chance que les données soient pile égale à END, tu auras tjrs qqchose devant ! Il faut tester si les trois derniers caractères END, ce n'est pas pareil !
Cette technique est bonne ... si tu n'expédies pas plusieurs fichiers à la suite. Si c'est le cas, ton END sera noyé dans les données du 1er envoi et du suivant.
La meilleure technique réside donc dans l'utilisation du transfert de l'info principale : la longueur des données transmises.
A toi d'imaginer la manière de le faire.
En cherchant un peu parmi les centaines de sourcces de vbfrance qui parlent de chat ou de transfert de fichier, tu trouveras des idées.
Vala
Jack
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)
myarouvb
Messages postés40Date d'inscriptionsamedi 11 novembre 2000StatutMembreDernière intervention 4 avril 2005 27 mars 2005 à 19:01
Ok.... Mais ta variable Données1 (ou Données2), de quel type est elle?
Parce que pour ma variable screenshot, qui est de type string, si je mets tout le contenu du fichier à l'intérieur, elle arrive vite à saturation!
C'est plutôt à ce niveau là que se localise mon problème....