Thread et serveur UDP [Résolu]

Signaler
Messages postés
28
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
29 mai 2007
-
Messages postés
28
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
29 mai 2007
-
Salut,

J'ai fait une IHM qui doit démarrer un serveur UDP à partir de l'appuie sur un bouton. Puis en réapuyant sur ce même bouton je voudrais arreter le serveur.
J'ai donc créer un thread pour mon serveur. A l'intérieur de la fonction "run" j'ai une boucle "while(true)" qui attend qu'un message arrive sur ma socket :

    while(true) {
                       count = socket_udp->ReceiveFrom(buffer_reception,_port_distant);
                         .......
                      }

Le truc c'est que je n'arrive pas à arreter mon thread correctement car quand je fais monThread->abort() suivi de monTread->Join(), ma fenetre se fige et plus rien ne marche. Je crois que c'est dû à ma boucle while.
J'ai essayé de remplacer le "true" par un booléen que je passe à false lorsque j'essaie d'arreter mon Thread mais ça ne marche pas non plus.

Je ne sais pas quoi faire.

Help....!

9 réponses

Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
10
Voila ce que me dit mon MSDN (vieille version puisque encore compatible avec le F1 sous VC6)

The closesocket function closes a socket. Use it to release the socket
descriptor s so further references to s will fail with the error
WSAENOTSOCK. If this is the last reference to an underlying socket, the
associated naming information and queued data are discarded. Any pending
blocking, asynchronous calls issued by any thread in this process are canceled
without posting any notification messages

La fin veut bien dire ce qu'elle veut dire: Tout ce qui est en attente bloquante est annulé.
Il faudrait aller voir sous Linux dans les man si c'est la même chose mais en tout cas sous windows, ca fait bien ce que l'on souhite que ca fasse.
Vive le C
Savon
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ton problème est peut être lié au fait que la fonction ReceiveFrom soit bloquante. Il faudrait trouver un moyen d'ajouter un timeout, ce qui te permettrait d'utiliser un booléen dans ta boucle.
Sinon, tu va être obligé de tuer simplement le thread, même si c'est déconseillé de le faire

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
28
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
29 mai 2007

Salut Vecchio.

Je suis un peu nul en c++ donc faudrait que tu m'expliques quelques petits trucs.
Si j'ai bien compris, le timeout servirait à "relancer" ma boucle while et donc à ré-évaluer mon booléen. Question:: comment on fait???
Sinon qu'entends-tu par "tuer simplement"? Si c'est faire un monThread->abort(), j'ai déjà essayé et ça n'arrive pas à tuer mon thread.

Merci d'avance pour tes précisions.
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
10
Pour fermer ton thread proprement en réévaluant ton booléen, il faut que tu fermes ta socket. Ceci forcera ton ReceiveFrom à renvoyer une erreur de lecture, et tu pourras sortir de ta boucle while.
J'ai mis un exemple avec les fonctions recvfrom et sendto ici.
Le fichier qui devrait t'intéresser est network.c.
Tu trouveras dedans un thread qui écoute en permanence sur sa socket. Lorsque je quitte le programme, je ferme la socket ce qui entraine la fermeture du Thread.
Vive le C
Savon
Messages postés
28
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
29 mai 2007

J'ai essayé la solution de vecchio qui consiste à mettre un timeout (socket_udp->ReceiveTimeout = 5000) et donc toute les 5 secondes cela déclanche une SocketException que je catch dans mon while et ça relance la boucle et par conséquent l'évaluation de mon booléen. ça marche donc nickel mais cette solution ne semble pas satisfaire mes profs qui disent qu'il doit y avoir une façon de forcer l'arret du thread sans passer par un timeout.
Je vais donc essayer la solution de julienbj (en fermant ma socket).
Sinon vecchio56 si tu as des précision à m'apporter quand tu disais "tuer simplement" je suis preneur...

Merci à tous les deux.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ca dépend comment tu gères tes threads
Moi je fais avec CreateThread (librairie Win32)
Avec un TerminateThread, le thread si termine
Mais partout on te dira que c'est dangereux de terminer un thread comme ca
Tu peux regarder par exemple dans la MSDN:
"Un éditeur de ressources gratuit pour Windows
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
10
Oui, c'est sur qu'avec la solution que je propose, ce doit etre à partir d'un autre thread que tu demandes la fermeture du thread dans lequel tu es bloqué, puisque justement tu es bloqué dedans. Mais ceci est au meme titre que ta solution Vecchio, pour tuer le Thread qui est bloqué sur la lecture, tu dois etre dans un autre Thread. Moi ce que je propose, c'est que dans cet autre thread, au lieu de faire un TerminateThread, tu fasses un closesocket et tu passes le booléen de scrutation de la boucle while à faux.
Vive le C
Savon
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Logiquement on devrait pas pouvoir fermet la socket, vu qu'elle est en train d'être utilisée par ReceiveFrom (de la même manière qu'on ne devrait pas pouvoir fermer un fichier pendant qu'on est en train de le lire).
Ca peut peut-être marcher, j'ai jamais essayé, mais si ca se trouve on aura des résultats différents selon le système

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
28
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
29 mai 2007

ça marche!!!!!
Bon je trouve que ça fait un peu bricolage et j'espère que mes profs ne vont pas gueuler mais en tout cas ça marche.
Merci a tout les deux

Ps: une question qui n'a pas grand chose à voir :
Comment on poste correctement du code dans un message (bien formaté comme dans les exemples de code du site) si c'est possible, et est-ce que l'un d'entre vous se dévouerait pour regarder mon code car je suis sûr que j'ai fais une grosse tambouille pas très pro. Voilà. Merci d'avance...