[vb6] ConnectionRequest et SendData.. :'(

Résolu
mymylanouille Messages postés 6 Date d'inscription samedi 30 novembre 2002 Statut Membre Dernière intervention 15 juillet 2004 - 15 juil. 2004 à 14:40
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 16 juil. 2004 à 03:18
Bonjour à tous :)

wala, je fais un p'tit serveur et j'ai un problème.
J'utilise Winsock..
Faut absolument, que quand un client se connecte, le serveur lui envoie un message. Cependant, si je met
un sendData dans l'évènement, connectionrequest
il est jamais envoyé, enfin en réalité, ce message est envoyé collé au suivant, si un autre client envoi un message.

Et le problème est le même pour tout sendData mis ds cet évènement, meme si c'est destiné à un autre client déjà connecté depuis longtps..

wala j'arrive pas à trouver de solution...
et pourtant y'a un doevents qui suit le sendData..

PS: dsl si c'est un peu brouillon mais je suis un peu en retard lol, j'éclaircirai ça ce soir en rentrant. Merci pour les réponses :)

Bonne journée ^^

>>Les nouilles sont reines<<

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
15 juil. 2004 à 15:28
Salut mymylanouille
(pas mal d'info sur le forum à propos des WinSock)

-1- Quand le serveur reçoit un ConnectionRequest, il faut d'abord accepter la connexion avant de pouvoir communiquer :
MonWS.Accept RequestID


-2- Si tu envoies une rafale de messages, c'est normal qu'ils arrivent tous les uns derrière les autres.
Winsock utilise un buffer pour mémoriser les messages entrant car le composant ne va lire les données que lorsque le processeur lui en donne le temps.
Pour palier à cet inconvénient, je te conseille d'ajouter à la fin de chaque message un caractère de reconnaissance de fin de message, un caractère qui ne risque pas d'apparaitre dans un texte standard. Moi, j'utilise Chr(0) :
MonWS.SendData "Mon texte" & Chr(0)

A la réception, il te suffit de repérer le caractère pour isoler chaque message :
Si tu as récupéré le contenu du buffer dans la chaine "Recu" :
MonWS.GetData Recu, , bytesTotal
r = Instr(1, Recu, Chr(0))
Do While r <> 0
' Nouveau message
NouveauMessage = Left(Recu, Instr(1, Recu, Chr(0) - 1)
Recu = Mid(Recu, Instr(1, Recu, Chr(0) + 1)
r = Instr(1, Recu, Chr(0))
Loop


-3- A l'inverse, si ta machine est rapide et que ton réseau est un peu chargé, ou encore si les données sont volumineuses, il est possible que l'évènement DataArrival se déclenche alors que la totalité du message n'est pas encore arrivé.
Dans ce cas, il n'y aura pas de Chr(0) présent dans les données puisque les données sont incomplètes.
Il te faut garder sous le coude les données incomplètes : Tu vas dimensionner la variable chaine qui va emmagasiner les caractères entre deux exécutions du DataArrival comme ceci :
Static Recu As String

Ensuite, à chaque fois que tu reçois des données, tu les ajoutes :
Dim Temp As String
MonWS.GetData Temp, , bytesTotal
Recu = Recu & Temp

Et derrière, tu mets la boucle Do-Loop décrite dans le -2-

Vala
Jack
3
mymylanouille Messages postés 6 Date d'inscription samedi 30 novembre 2002 Statut Membre Dernière intervention 15 juillet 2004
15 juil. 2004 à 19:14
je viens de rentrer:)

Rohlàlà, t'as fait une superbe réponse, franchement c'est excellent. en fait c'était le chr(0) que je cherchais, en java j'utilisais l'équivalent.. seulement je trouvais pas.

Roh je suis trop content lol, mon problème est réglé grâce à toi.

Grand merci :-*

>>Les nouilles sont reines<<
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
16 juil. 2004 à 03:18
Ah bah ça fait plaisir d'avoir des remerciements ! (et ça devient rare)
0
Rejoignez-nous