Pbs de WinSock

Mix78 - 2 juin 2001 à 14:19
 Mix78 - 7 juin 2001 à 16:22
Salut à tous

!!ATTENTION!!

Cette question est la mème que "ForumVBFr\Reseau & net\'Wsk MultiClient'. MAIS EN + CLAIR!

Ma question est un peu longue, si vous êtes lassés allez tout en bas (Goto < EN BREF: >)

---------------

Si j'ai bien compris MSWinsock est un controle gerant des comunications 'asychrone' entre sockets;

Une application client peut ainsi envoyer un message a une application serveur mais n'attends pas de réponse

EX:

Commande normale de WSK:
-------------------------------------------

WSock.SendData Message$

Cette commande envoie une chaine au socket qui sera envoyée à l'autre socket et basta, le destinataire peut en faire les usage qu'il préfère (idela pour un chat ou le données sont traitées par les utilisateurs sans qu'il est traitement autoamtique des ces données et renvoi d'une réponse)

Commande que j'ai voulu implémenter:
-------------------------------------------------------

Réponse_attendue$ = WSock.QuerySrv (TypeQuestion$, Arg_1$, Arg_2$)

J'ai créé un OCX contenant (entre autres) cette fonction membre qui envoie les données (que l'appli serveur doit traiter), attends une réponse du serveur et renvoie la chaine recue comme valeur de retour de fonction (Réponse_attendue$).

Mon problème:
--------------------

La Fonction en question attends la réponse du serveur dans une boucle:

Do
DoEvents

Sock(0).getdata StrData$ ' <---- Si le serveur à répondu alors sa réponse est stockée dans StrData

If StrData$ <>"" then Exit Do ' <----- Là je simplifie un peu pour eviter d'être lassant

Loop

Le problème est 'DoEvents', si je l'y met pas SendData attends pour envoyer la chaine et donc je ne recois rien;
l'execution s'arette si la fonction est apelée une seconde fois.

Quand ma fonction est interrompue de cette manière il se passe ceci:

Envoi le la chaine question

---------------------coupure-----------------------

Nouvel envoi d'une question

Reception de la reponse à la question précedente!

En fait la réponse reçue sera mème la réponse a une question anterieure car tant qu'il y a des appels en attente la foction est coupée au niveau de DoEvents.

EN Bref:
-----------

Comment faire un DoEvents qui actualiserai sans permettre toutefois de couper l'éxecution du code de la fonction qui le contient?

2 réponses

Moi, je fonctionne avec des messages, c'est à dire que:

Pour chaque type de message, je compose une entête énoncant le type proprement dit et la longueur totale du message (longueur de l'entête + longueur du contenu) et dans WSock.DataArrival j'ai (en var globale) un flag qui me permet de déterminer si j'ai ou non reçu une entête et sinon si ou non j'ai tout reçu (ex: un fichier de 20Ko, si on ne change pas les clés du registre qui régissent WinSock, on le reçoit par tranche de 8Ko), le nombre d'octets étant marqué dans mon entête je sait quand arrêter la réception et traiter.

Ainsi, pour une chaine simple j'aurai:
"
TypeMessage = TMsg001{vbCrLf} '001 fait parti du nom du type et non un compteur
Longueur = 60{vbCrLf}
{vbCrLf}
Ceci est un message!
"

Quand j'analyse, je recherche les deux entête (TypeMessage et Longueur) pour connaitre le contenu et ensuite je cherche où vbCrLf+vbCrLf commence, car 2 octets plus loin sont mes données.

.DataArrival concatène le contenu de .GetData dans une var globale jusqu'à ce que j'ai tout reçu, ensuite .DataArrival appelle une fonction qui connait tout les messages possibles et sait les traiter, puis elle vide cette variable.

Il suffirait donc d'ajouter un champs nommé, disons 'RtnReponse : ' suivit de O/N selon le type de requête (ou nommer un type de message spécifiquement tel 'TypeMessage = TQrySvr') et de le traiter comme tel.

J'ai mon code au bureau, si tu veux je pourrais essayer d'en ripper le nécessaire demain, mais pas trop pcq mon boss aimerais pas voir notre code sur le net pour sûr! :)
0
-------------------------------
Réponse au message :
-------------------------------

Moi, je fonctionne avec des messages, c'est à dire que:

Pour chaque type de message, je compose une entête énoncant le type proprement dit et la longueur totale du message (longueur de l'entête + longueur du contenu) et dans WSock.DataArrival j'ai (en var globale) un flag qui me permet de déterminer si j'ai ou non reçu une entête et sinon si ou non j'ai tout reçu (ex: un fichier de 20Ko, si on ne change pas les clés du registre qui régissent WinSock, on le reçoit par tranche de 8Ko), le nombre d'octets étant marqué dans mon entête je sait quand arrêter la réception et traiter.

Ainsi, pour une chaine simple j'aurai:
"
TypeMessage = TMsg001{vbCrLf} '001 fait parti du nom du type et non un compteur
Longueur = 60{vbCrLf}
{vbCrLf}
Ceci est un message!
"

Quand j'analyse, je recherche les deux entête (TypeMessage et Longueur) pour connaitre le contenu et ensuite je cherche où vbCrLf+vbCrLf commence, car 2 octets plus loin sont mes données.

.DataArrival concatène le contenu de .GetData dans une var globale jusqu'à ce que j'ai tout reçu, ensuite .DataArrival appelle une fonction qui connait tout les messages possibles et sait les traiter, puis elle vide cette variable.

Il suffirait donc d'ajouter un champs nommé, disons 'RtnReponse : ' suivit de O/N selon le type de requête (ou nommer un type de message spécifiquement tel 'TypeMessage = TQrySvr') et de le traiter comme tel.

J'ai mon code au bureau, si tu veux je pourrais essayer d'en ripper le nécessaire demain, mais pas trop pcq mon boss aimerais pas voir notre code sur le net pour sûr! :)

Je te remercie, mais je n'ais pu obtnir l'effet désiré donc
j'ai fait un OCX qui gere une conection multicilent en utilisant le buffer d'un fichier en mode random
(pas besoin de doevents...) c'est un peu plus lent mais ça va!!!
de nouveau merci et à +

YFuturonline!!
0
Rejoignez-nous