Programme trop rapide pour Winsocks?

Résolu
Skarzag Messages postés 2 Date d'inscription jeudi 5 juin 2008 Statut Membre Dernière intervention 3 novembre 2008 - 3 nov. 2008 à 03:24
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 3 nov. 2008 à 05:56
Bonjour à tous!

Langage : VB6

En fait je veux que mon client prévienne le serveur qu'il se ferme et donc que le serveur peut fermer le Winsock affecté à ce client.
Hors quand je demande à WinClient.SendData de prevenir le serveur, le programme "saute" l'instruction et ferme le WinClient ainsi que mon programme sans prévenir le serveur (qui se retrouve tout bête le pauvre avec sa connexion ouverte dans l'vent et son compteur de connexion pas à jour)

Et voilà le code :

<hr size="2" width="100%" />Private Sub Form_Unload(Cancel As Integer)If WinClient.State = sckOpen ThenWinClient.SendData ("_CloseConnection_")            <-- Instruction qui ne s'éxecute pas =/DoEventsWinClient.CloseEnd IfDoEventsEnd Sub<hr size="2" width="100%" />Je précise que je mets des DoEvents partout ne sachant pas trop à quoi ils servent exactement mais ils ont partiellement réglé un problème que je vais également mettre en avant.

Dans une boucle de ce type :
For i = 1 to 3
WinServer.SendData ("pouet" & i)
DoEvents 'Rajouté pour PARTIELLEMENT reglé le problème
Next

Le serveur n'a parfois pas le temps d'envoyer 1 par 1 les données et il fait parfois des concatenations (pouet1pouet2)

J'ai donc partiellement reglé le problème avec un DoEvents mais il arrive encore parfois que je recoive des chaines concatenées au lieu de mes precieuses chaines l'une apres l'autre

PS : Le programme que je code est une sorte d'agenda client/serveur qui permet au client d'ajouter/consulter/modifier ses rendez-vous sur le serveur du réseau local (de son entreprise?). Serveur qui pioche les infos dans une BDD Access. Si ca interesse quelqu'un je peux le mettre en ligne apres l'avoir quasi finalisé (c'est un programme que je réalise dans le cadre de mon BTS)

3 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
3 nov. 2008 à 05:56
1. j'aurai du écrire "peut-être". juste parce que cet évènement se déclenche avant le unload....
néanmoins mon "3." était là aussi pour éviter le "1."

2. je ne faisais que te détailler le fonctionnement du code que tu appliquais (cf "

ne sachant pas trop à quoi ils servent exactement

"), en aucun cas bombarder de doevents n'est une solution miracle...
(bombarder, car c'est ce que çà devient lors d'envois massifs)

ce n'est pas que ce n'est pas fiable..., c'est que le but d'envoyer des data, c'est justement de les envoyer, pas de les parceller selon son envie, surtout si les envois sont rapprochés

une meilleur solution serait d'entrecouper tes envois par un séparateur "perso" (en conservant ou non tes doevents)
le serveur, lui, travaille alors en tampon et découpe selon ton séparateur
à supposer ### (mais tu peux jouer avec des caracs non affichables, non saisissables, etc...)

"bonjour###"
il travaille sur "bonjour" et ne garde rien (tampon static)

"bonjour###comment çà va###"

il travaille sur "bonjour", puis "comment çà va" et ne garde rien


"bonjour###comment çà"

il travaille sur "bonjour" et garde "comment çà"

puis

" va###"
tampon + " va", et ne garde rien



c'est, encore une fois, au serveur (mais c'est le même côté client) de travailler sur la réception

aucune idée pour une solution en .net

3. ?? des suites?

bon courage et bons tests

<hr size="2" width="100%" />
Prenez un instant pour répondre à [forum/sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
3 nov. 2008 à 04:03
salut,

1. en plaçant ta commande au _queryunload, tu auras plus de chances que l'envoi soit correctement effectué

2. doevents va en effet donner la main rapidement à l'OS, ce qui laisse le temps au socket d'envoyer tes data

3. ce n'est pas au client d'informer qu'il va déconnecter. on peut très bien supposer un crash de ton appli, le problème sera alors le même.
par contre lors de l'interruption du socket client (erreur, crash appli, autre), le socket serveur reçoit un changement d'état. c'est donc le serveur qui doit jouer...
la première chose est donc de bien penser à fermer le socket serveur dans le _error, mais aussi dans le _close

ps : topic déplacé de VB.NET vers VB6...

<hr size="2" width="100%" />
Prenez un instant pour répondre à [forum/sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0
Skarzag Messages postés 2 Date d'inscription jeudi 5 juin 2008 Statut Membre Dernière intervention 3 novembre 2008
3 nov. 2008 à 05:16
1 - Malgré la mise en place du code dans le _queryunload (pourrais-tu expliquer la particularité de cet evenement par rapport à unload?) celà ne fonctionne toujours pas :s
<hr size="2" width="100%" />De plus les DoEvents n'ont reglés que partiellement mon problème de chaines concatenées.
J'ai encore cherché et j'ai trouvé plusieurs solutions mais aucunes vraiment sympa (+ efficace que le DoEvents seul mais pas infaillible ou alors à base de Split, un peu bordelique mais réalisable).

Dois-je m'habituer au fait que le WinSock soit un outil peu fiable sur ce point?
Il y a t-il une amélioration dans l'environnement .Net?

<hr size="2" width="100%" />
Je vais tenter de résoudre des problèmes demain avec des techniques d'attente comme décrites par exemple ici

Merci PCPT pour ta réponse précédente et pour celles qui arriveront (et merci à toi aussi, oui toi là-bas! qui va peut-etre répondre à mon post)
0
Rejoignez-nous