Timer qui freeze ?

WolfSpirit2a Messages postés 19 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 19 septembre 2007 - 4 sept. 2005 à 22:22
WolfSpirit2a Messages postés 19 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 19 septembre 2007 - 5 sept. 2005 à 03:14
Voila déja bonjour tout le monde et merci de prendre un peu de votre temps pour lire mon topic :p



Mon probleme est le suivant :

j'ai une application de chat client d'un coté et serveur de l'autre. Ce
chat etant multisessions, je dois régulierement envoyer de mes clients
un packet au serveur pour lui informer que le client est toujours
online.

Ceci se fait grâce à un timer qui, toutes les X secondes, verifie si le
winsock est connecté au serveur et lui envoit un petit packet si c'est
connecté.

Jusqu'ici, tout va bien mais c'est là que ca se corse !

en effet, j'ai pu me rendre compte , une fois qu'une autre application
du style JEU (pas un logiciel du style paint ou quoi.. non non un jeu
par exemple :)) passe au dessus du client, le timer ne compte plus, ou
il compte trèèèès doucement (1mn pr envoyer une fonction au lieu de 5
sec ..) !

Donc au lieu d'envoyer au serveur un packet toutes les 5 secondes pour
lui dire "je suis toujours là" par exemple, une fois que l'application
passe en arriere plan derriere le jeu le timer s'arrete et donc
n'envoit plus rien, mon client fait alors un timeout car le serveur ne
voit plus de packets arriver ...

Inutile de vous dire que ceci est bien embetant .... vu que mon tchat vient se placer devant le di jeu en question :(



Si quelqu'un peux m'aider svppppp :)



Merci.



WolfSpirit, Admin de Ultimates-Online.

11 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
4 sept. 2005 à 22:35
salut,
je crois bien que c'est le principe même du Timer qui est mauvais. le serveur ne doit pas réagir si un paquet n'est pas "renvoyé" (accusé de réception) au bout du temps prédéfini par l'intervalle du Timer, mais juste parce que la connection est interrompue, donc à l'évenement Close de ton WinSock.

j'espère être assez clair.
PCPT
0
WolfSpirit2a Messages postés 19 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 19 septembre 2007
5 sept. 2005 à 01:22
bah le principe de "l'accusé de reception" c'est partout pareil non ? le fameux Ping.. Pong ! sur irc par exemple ... :)
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
5 sept. 2005 à 01:35
ouai, et?
tu as 2 personnes connectés ensemble (en l'occurence, un client et un serveur).
ce n'est pas le serveur qui doit envoyer un message toutes les .... 30 secondes, et considérer son client comme déconnecté s'il n'a pas d'accusé de réception! il ne considère la coupure de connection que quand c'est vraiment le cas, donc en observant son évènement Close
PCPT
0
WolfSpirit2a Messages postés 19 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 19 septembre 2007
5 sept. 2005 à 01:46
Nan mais le serveur n'envoit rien lui .. il compte seulement depuis combien de temps il n'a pas reçu de packet du client :)

si on décompose, ca marche comme ca :

le serveur compte pour le client n°1

1 sec .. 2 sec .. et hop il recoit un packet du client n°1, donc il remet son compteur à 0 et ca recommence ..

mais si il ne recoit rien et que son compteur dépasse les 15 sec alors il coupe la connexion :p

de son coté le client lui est chargé d'envoyer ce packet automatiquement toutes les 2 secondes par exemple :)
0

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

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
5 sept. 2005 à 02:01
t'es bien d'accord que le client peut très bien rester plus de 15 secondes connecté sans envoyer de paquet (d'où ton problème). comme ta logique s'est mise sur ce principe de timer, qui est faux (preuve en est), il faut gérer çà différemment, à savoir (3e fois) gérer réellement un client DECONNECTé quand il l'est.

ps : à la première connection, le fait que le serveur accepte, c'est en soit un message. donc le serveur en envoie aussi ;)
PCPT
0
WolfSpirit2a Messages postés 19 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 19 septembre 2007
5 sept. 2005 à 02:31
En tout cas je me suis orienté plutot sur ta
méthode, c'est à dire supprimer un compte utilisateur actif avec la
methode Winsock_close() plutot que si il ne répond pas apres plusieurs
secondes et je dois dire que pour le moment ca marche moyennement bien.

Si je ferme le programme d'un coup sous VB en utilisant le bouton STOP
on voit bien sur mon prog "Le client machin ne répond plus ..
déconnexion du client." par contre si je ferme le programme avec CTRL
ALT et SUPPR, dans ce cas je vois toujours un ghost du client connecté
sur le serveur :/

Comment dois-je faire dans ce cas ? :\

Je vais continuer a chercher de mon coté, peut etre en faisant une
boucle qui verifie l'etat de chaque winsock (connecté ou non).
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
5 sept. 2005 à 02:38
c'est à toi d'ajouter dans ton client à l'UnLoad -> Socket.Close
ce qui est certain, c'est que tu as moins de problème qu'avec le timer. en plus, c'est ton serveur qui subirait une erreur en cas d'envoie de paquets sur un socket fermé.
PCPT
0
WolfSpirit2a Messages postés 19 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 19 septembre 2007
5 sept. 2005 à 02:45
bah oui mais le probleme c'est que quand tu ferme
ton programme avec ALT + CTRL + SUPPR la fonction Form_Unload n'est pas
gérée vu que ton programme se ferme brusquement.. ce qui me laisse un
jolie ghost sur le serveur :/
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
5 sept. 2005 à 02:55
ouai, c'est un 2e problème. celui énoncé au départ est bien résolu.
donc commencer sa phrase par "mouai, j'ai essayé ta méthode, çà marche moyennement", c'est une assez mauvaise accroche pour demander une aide qui n'a plus aucun rapport ;)

tu peux donc valider ton problème pour les futurs lecteurs et voici la suite :

ton appli a craché, donc des évènements sont toujours en cours.
après ce "End", le Socket Serveur n'a pas eu de "Close". mais as-tu vérifié s'il était toujours en State 7?
s'il est en cours de fermeture, çà résoud tout.
sinon, il faut créer une autre appli, en tansparence, qui observe le gestionnaire des tâches, et qui informe le serveur au moment ou ton appli ne tourne plus.

ShareVB a posté une source aujourd'hui même, tu y trouveras facilement comment lister les process.
(inutile si tu arrives à repérer un Etat en cours de fermeture...)

PCPT
0
WolfSpirit2a Messages postés 19 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 19 septembre 2007
5 sept. 2005 à 03:00
Désolé si j'ai pas été clair : ton aide m'a été
d'un bien grand secours et je t'en remercie bien :) quand je disais que
ca marchait moyennement c'etait pour dire que pour le cas ou ca tourne
c'etait nickel mais dans le cas d'un plantage ca ne marchait pas :)

Hors moi depuis le début je cherche comment gerer les déconnexion des
tchatteurs dans le cas d'un arret non prévu (style le pc qui crash, la
connexion internet qui se coupe etc ...) c'est pour ce cas là que je
cherche en faite ;p désolé si je n'etait pas assez clair ;)

Je vais continuer à chercher et encore merci PCPT :p
0
WolfSpirit2a Messages postés 19 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 19 septembre 2007
5 sept. 2005 à 03:14
Et voila exactement ce que je pensais depuis le début ;p

Il ma suffit de creer un module de vérification des états des winsock,
maintenant si le client plante ou coupe son logiciel avec CTRL + ALT +
SUPPR, le serveur s'en rend compte et ferme la session.

Voici le bout de code que j'ai rajouté si ca peux aider quelqu'un :



Private Sub tcheck_Timer()

Dim vi As Integer

For vi = 1 To UBound(usr)

If usr(vi).Pseudo <> "" And usr(vi).Vacancy = 0 Then

' si le pseudo n'est pas vide, Vacancy = 0 veux dire que la place est occupée par un client :p

If ws(vi).State <> sckConnected Then

' le client a surement planté ..

SendSysMessage2 vi, Mid$(usr(vi).Pseudo, 2, Len(usr(vi).Pseudo)) + " ne répond plus ... "

Wait

sttb.SimpleText = "Le client #" + Str$(vi) + " ne répond plus ... déconnexion."

Wait

CloseSession vi ' fermeture de la session, mettez ce que vous voulez :p

Wait

SendUsersList ' envoit de la nouvelle liste des utilisateurs.

Wait

End If



End If

Next vi



Bonne prog à tous ;p
0
Rejoignez-nous