|
begin process at 2008 07 20 15:52:28
Derniers logiciels
|
Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : Socket connectée [ Archives / Au secours ] (immerczeck)
|
Socket connectée
le 08/02/2006 20:57:23

immerczeck
|
Bonjour! Pourriez-vous m'indiquer une manière de vérifier qu'une socket est toujours active, que le client à l'autre bout n'a pas fermé l'application? J'ai essayé la méthode avec Poll et Available==0 mais ça ne donne rien, et j'ai lu que la propriété Connected ne s'actualisait pas au cours du temps, alors pourriez-vous me donner une méthode fiable?
Merci d'avance
Immerczeck
|
|
|
|
Re : Socket connectée
le 08/02/2006 21:34:45

MorpionMx
Membre Club 
(Admin CS)
|
Salut, Pourtant c'est une bonne technique (la bonne technique ? ) Qu'entends-tu par "ca ne donne rien" ? Une autre technique, dans le cadre d'un client qui se deconnecte "proprement" (pas de plantage), serait que le client envoie un message au serveur pour le prevenir qu'il se deconnecte. Sinon, je ne connais pas d'autre méthode que celle du Poll.
Mx MVP C#
|
|
|
|
Re : Socket connectée
le 08/02/2006 21:57:55

immerczeck
|
ben ça ne donne rien dans le sens où ça ne réagit pas lorsque le client se déconnecte. Voici un bout du code :
while(true) { [...] foreach (idclient client in ArrayList.Synchronized(clients)) { if(client.sock.Poll(10, SelectMode.SelectRead) && client.sock.Available==0) { richTextBox1.Text+= "Le client "+ client.nick+" s'est déconnecté\r"; listBox1.Items.Remove(client.nick); ArrayList.Synchronized(clients).Remove(client); }[...] } }
Pitetre me suis-je trompé quelque part... Sinon j'avais pensé à la solution du message envoyé par le client à déconnexion, mais comme tu l'as dit, dans le cas d'un plantage... c'est plutôt gênant de garder une socket déconnectée...
|
|
|
|
Re : Socket connectée
le 08/02/2006 22:22:37

MorpionMx
Membre Club 
(Admin CS)
|
Ca m'a pourtant bien l'air d'etre ca... Essayons de diagnostiquer... Est-ce que le thread dans lequel se trouve ta boucle tourne bien ? As tu essayé de debugger en pas a pas, pour voir les valeurs qu'il pouvait te donner ? (genre ton arraylist vide) Es-tu sur que le client avec lequel tu testes est bien deconnecté (ca peut paraitre bete comme question, mais bon, parfois on pense qu'on a fermé le client, mais le process tourne encore en fond parce qu'un thread n'a pas sa propriété IsBackground a true)
Mx MVP C#
|
|
|
|
Re : Socket connectée
le 08/02/2006 22:36:33

immerczeck
|
Oui, le client est bien déconnecté, je n'ai pas mis ISBackground à true, c'est trop brutal, j'ai arrangé l'évènement Closing de la form. Je teste en réseau local, j'ai donc tous les moyens de vérifier. Le thread tourne bien, puisque c'est le même qui s'occupe de la gestion des messages (là peut-être que ça vient de là, j'aurais peut-être dû les séparer). L'arrayList n'est pas vide puis que j'ai en permanence une listbox qui m'affiche tous les client.nick.
Immerczeck
|
|
|
|
Re : Socket connectée
le 09/02/2006 10:36:02

MorpionMx
Membre Club 
(Admin CS)
|
Réponse acceptée !
Bonjour, Je suis très embété parce que je viens de faire un rapide essai, et ca marche. Le code dans mon thread :
lock(this.clientsList.SyncRoot) { foreach (Client client in this.clientsList) { if (client.Socket.Poll(10, SelectMode.SelectRead) && client.Socket.Available == 0) Console.WriteLine(string.Format("client {0} deconnecté", client.IDClient)); } }
Par contre c'est sur que je mettrais pas ce code dans le thread qui gere les message, mais dans un thread dedié a la detection de deconnexion sauvage.. Et dans ce thread, je ne ferais pas de boucle active ( while(true) ), mais je le déclencherais plutot via un timer, toutes les X secondes.
Mx MVP C#
|
|
|
|
Re : Socket connectée
le 09/02/2006 10:53:45

coq
(Admin CS)
|
Réponse acceptée !
Ou en mettant une pause, ainsi que la gestion de ThreadAbortException.
Sinon tu peux aussi prévoir dans ton protocole un timeout au bout duquel tu considères que ton client est parti si tu n'as pas reçu de données. Ou définir un message auquel le client doit répondre pour signaler qu'il est toujours là. :-)
/* coq MVP Visual C# */
|
|
|
|
Re : Socket connectée
le 09/02/2006 11:02:00

MorpionMx
Membre Club 
(Admin CS)
|
J'aurais aussi fait ca, (et d'ailleurs, j'ai toujours fait ca jusque maintenant). Mais j'ai recemment entendu d'un prof que c'etait pas terrible de faire une boucle dans un Thread avec une pause dedans, alors j'ai voulu donner une autre possibilité, en me disant qu'elle etait peut-etre meilleure que la mienne. Maintenant, si tu ferais comme ca aussi coq, c'est que ca doit pas etre une si mauvaise solution que ca
Mx MVP C#
|
|
|
|
Re : Socket connectée
le 09/02/2006 11:07:20

coq
(Admin CS)
|
Je ne suis pas très pointu en threading, mais c'est juste que l'utilisation d'un timer pour lancer le thread à intervalle réguliers me paraissait un peu bizarre. Je vais essayer de trouver des infos sur la question.  /* coq MVP Visual C# */
|
|
|
|
Re : Socket connectée
le 09/02/2006 11:19:52

MorpionMx
Membre Club 
(Admin CS)
|
Réponse acceptée !
L'idée du Timer en plus clair :
System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(ListenForDeconnection), null, 0, 10000); [...]
private void ListenForDeconnection(object state) { foreach (idclient client in ArrayList.Synchronized(clients)) { if(client.sock.Poll(10, SelectMode.SelectRead) && client.sock.Available==0) { .... } } }
Mx MVP C#
|
|
|
Classé sous : socket, méthode, connectée
|
CalendriCode
| | | L | M | M | J | V | S | D |
| | 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 | | | |
|
Téléchargements
Logiciels à télécharger sur le même thème :
|
|