WolfSpirit2a
Messages postés19Date d'inscriptionmercredi 2 mars 2005StatutMembreDernière intervention19 septembre 2007
-
4 sept. 2005 à 22:22
WolfSpirit2a
Messages postés19Date d'inscriptionmercredi 2 mars 2005StatutMembreDernière intervention19 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 :(
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
WolfSpirit2a
Messages postés19Date d'inscriptionmercredi 2 mars 2005StatutMembreDernière intervention19 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).
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
WolfSpirit2a
Messages postés19Date d'inscriptionmercredi 2 mars 2005StatutMembreDernière intervention19 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 :/
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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...)
WolfSpirit2a
Messages postés19Date d'inscriptionmercredi 2 mars 2005StatutMembreDernière intervention19 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
WolfSpirit2a
Messages postés19Date d'inscriptionmercredi 2 mars 2005StatutMembreDernière intervention19 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.