(WINSOCK) Problème d'accès à un fichier après écriture

Résolu
myarouvb Messages postés 40 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 4 avril 2005 - 26 mars 2005 à 17:11
myarouvb Messages postés 40 Date d'inscription samedi 11 novembre 2000 Statut Membre Derniè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!!

13 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
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)
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
26 mars 2005 à 18:08
NB : Si tu veux réouvrir un fichier et ajouter des données à la suite, suffit d'ajouter la commande Append dans la commande d'Open (Voir l'aide)

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)
3
pjcleder Messages postés 183 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 16 septembre 2011 11
26 mars 2005 à 17:15
PAT
Aprés ton put, tu dois fermer le fichier (faire un close) pour que ton traitement soit pris en compte.
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
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)
0

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

Posez votre question
myarouvb Messages postés 40 Date d'inscription samedi 11 novembre 2000 Statut Membre Derniè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!

NOn?
0
myarouvb Messages postés 40 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 4 avril 2005
26 mars 2005 à 17:40
Jack, comment fermer mon fichier alors dans ces cas là, sans me prendre la tete avec la longueur des données qui suivent?
0
pjcleder Messages postés 183 Date d'inscription jeudi 4 février 2010 Statut Membre Dernière intervention 16 septembre 2011 11
26 mars 2005 à 18:36
PAT

Mais bon sang, mais c'est bien sur.

Si j'étais myarouvb, je mettrais un petit coup de peinture verte sur la réponse de jack !
0
myarouvb Messages postés 40 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 4 avril 2005
27 mars 2005 à 01:38
waouh !
0
myarouvb Messages postés 40 Date d'inscription samedi 11 novembre 2000 Statut Membre Derniè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
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
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)
0
myarouvb Messages postés 40 Date d'inscription samedi 11 novembre 2000 Statut Membre Derniè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....
0
myarouvb Messages postés 40 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 4 avril 2005
27 mars 2005 à 19:03
Aussi, comment connais tu la taile de tes données? Len(Données)?
0
myarouvb Messages postés 40 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 4 avril 2005
28 mars 2005 à 21:08
à l'aiiiideee!!!!
0
Rejoignez-nous