OVH Cloud OVH Cloud

Winsock

4 réponses
Avatar
john.ambou
Bonjour ,

J'essaye d'utiliser les winsocks en VB6 (en inserant sur mon form le
component) et j'aimerais savoir si l'envoi et la reception sont
bloquants (senddata et getdata) car dans mon programme je fais un
senddata vers mon serveur et ensuite un getdata (ceci doit r=E9cuper=E9
un mot pour signifier que mon envoi a =E9t=E9 bien recu).
Mais j'ai l'impression qu'il fait les 2 en meme temps et que le
getdata n'est jamais fait ....car sur mon serveur affiche le message
que je lui envoi avec senddata quand mon application a fini de
tourner...
(c'est =E0 dire que le getdata est deja pass=E9)

Quelqu'un pourrais t'il m'aider s'il vous plait ?

merci
Johnson

4 réponses

Avatar
john.ambou
Quelqu'un peut-il également m'expliquer comment on utilise les
evements qui se rapporte au winsock ?

Merci
Johnson
Avatar
Fred
Dans : news:,
disait :
Quelqu'un peut-il également m'expliquer comment on utilise les
evements qui se rapporte au winsock ?



C'est assez intuitif.
DataArrival se déclenche quand un paquet de données arrive.
Le paramètre donne le nombre effectif d'octets arrivés.
Avec GetData tu peux alors lire tout ou partie de qui est arrivé.
Attention, si tu ne lis pas tout, l'événement ne se redéclenchera qu'à
l'arrivée d'un nouveau paquet.

Et pour ton problème d'envoi de fichier, je te conseille de mettre à
profit l'événement SendComplete.
Plutôt que d'envoyer le fichier dans une boucle. Tu envoies chaque
nouveau bloc dans la procédure d'évènement SendComplete.
Cela nécessite de déclarer des variables au niveau de la feuille (taille
du fichier, nombre d'octets envoyés)

Tu commences par envoyer un premier bloc de taille N (tu peux utiliser
une taille plus importante que 20 et attention au fait que les tableaux
débutent à l'indice 0) ou bien de la taille du fichier si elle est
inférieure à N. Ce premier bloc est envoyé en dehors de la procédure
SendComplete pour initialiser le mécanisme.
Le mieux est peut-être de déclarer le tableau buffer sans le
dimensionner. Avec un Redim tu peux l'ajuster à ce qu'il faut envoyer :
ce sera utile pour le dernier bloc. Et le GET en mode binaire à besoin
d'une variable de taille bien définie et non pas un variant comme tu as
pu le constater avec ton buffer non déclaré.

Ensuite, dans la procédure évènement, tu dimensionnes et lis le bloc
suivant, déterminé par les variables de feuille.
C'est donc le départ de chaque bloc qui déclenche le départ du suivant.

En procédant ainsi, ton programme n'est jamais bloqué.

Pour finir, je n'utiliserais pas un accusé de réception à chaque bloc
envoyé mais plutôt un mécanisme de contrôle en fin de transfert.
En envoyant un checksum ou un CRC (plus compliqué à programmer) par
exemple à la fin de l'émission. Il serait calculé pendant l'émission et
le récepteur pourrait calculer le sien pendant la réception et le
comparer avec celui reçu.


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
john.ambou
Bonjour,

Merci de ton aide mais il subiste encore qq questions. En effet , dans
mon programme que voici :

Winsock1.Senddata buffer 'j'envoie un buffer
Winsock1_dataarrival(4) 'la recpetion de ce buffer me permet de verfier
si le serveur a bien recu le buffer que j'ai envoyé ci dessus.

Le sub winsock1_dataarrival contient la fonction getdata.


Or ceci ne fonctionne pas je ne comprend pas pk d'ailleurs je pense
meme que le send se fait lorsque l'application se termine car elle
apparait sur mon ecran serveru seulement a la fin avez vous un exemple
qui me permettrait d'envoyer et recevoir a la suite un buffer ?

Ou une explication pour mon probleme ?

Merci de votre aide
Johnson
Avatar
Fred
Dans : news:,
disait :
Bonjour,



Bonjour,

Merci de ton aide mais il subiste encore qq questions. En effet , dans
mon programme que voici :

Winsock1.Senddata buffer
Winsock1_dataarrival(4)



Non ! On n'appelle pas une procédure évènementielle. Elle est appelée
automatiquement. :-)
Enfin bon, puisque tu tiens à procéder ainsi je te propose deux
solutions. Je ne peux pas trancher car je n'ai pas de vb6 sous la main
et je ne me souviens plus si le GetData est bloquant ou non (ce n'est
pas précisé dans la msdn en ligne).

1/ en supposant qu'il soit bloquant :

Dim ack As Long
Winsock1.SendData buffer
Winsock1.GetData ack

Je suppose ici que les 4 octets que tu sembles attendre forment un
entier long.
Sinon il y a cette possibilité :

Dim ack(3) As Byte
Winsock1.SendData buffer
Winsock1.GetData ack, vbByte, 4

2/ Sinon

Winsock1.SendData buffer
While Winsock1.BytesReceived < 4
DoEvents
Wend
Winsock1.GetData .....

Il est précisé dans l'aide que si le nombre d'octets arrivés n'est pas
suffisant pour remplir la variable passée en paramètre à GetData, alors
cette variable reste vide.
Donc il est probable que GetData soit non bloquant. Et cela expliquerait
pourquoi tu ne reçois rien, car lorsque tu appelles GetData, la réponse
n'est pas encore là.



Or ceci ne fonctionne pas je ne comprend pas pk d'ailleurs je pense
meme que le send se fait lorsque l'application se termine car elle
apparait sur mon ecran serveru seulement a la fin



Oui, mais alors là, sans plus d'informations, la porte reste ouverte
pour une multitude de raisons.
En particulier, l'erreur peut venir du programme serveur lui-même.

Poste les codes. On y verra plus clair.

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT