begin process at 2012 02 13 07:40:44
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Thread et serveur UDP


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Thread et serveur UDP

dimanche 29 octobre 2006 à 22:32:50 | Thread et serveur UDP

nico971gwada

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....!

dimanche 29 octobre 2006 à 22:41:51 | Re : Thread et serveur UDP

vecchio56

Administrateur CodeS-SourceS
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

dimanche 29 octobre 2006 à 23:01:01 | Re : Thread et serveur UDP

nico971gwada

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.
lundi 30 octobre 2006 à 11:53:08 | Re : Thread et serveur UDP

julienbj


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

lundi 30 octobre 2006 à 14:18:56 | Re : Thread et serveur UDP

nico971gwada

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.
lundi 30 octobre 2006 à 14:25:59 | Re : Thread et serveur UDP

vecchio56

Administrateur CodeS-SourceS
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:
"TerminateThread is a dangerous function that should only be used in the most extreme cases"
Dans la JavaDoc, idem: la méthode stop de Thread est deprecated

Pour la solution de julienbj, tu peux pas l'appliquer vu que tu est bloqué dans par le ReceiveFrom (a moins que tu ne souhaites la fermer depuis l'autre thread)

_____________________________________
Un éditeur de ressources gratuit pour Windows

lundi 30 octobre 2006 à 14:39:49 | Re : Thread et serveur UDP

julienbj

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

lundi 30 octobre 2006 à 14:56:56 | Re : Thread et serveur UDP

vecchio56

Administrateur CodeS-SourceS
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

lundi 30 octobre 2006 à 16:26:30 | Re : Thread et serveur UDP

julienbj

Réponse acceptée !

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

lundi 30 octobre 2006 à 17:21:59 | Re : Thread et serveur UDP

nico971gwada

ç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...


Cette discussion est classée dans : serveur, while, thread, arreter, udp


Répondre à ce message

Sujets en rapport avec ce message

Passer des arguments à un Thread & framework 2.0 [ par nico971gwada ] Salut,Je dois faire une interface graphique qui permet de s'échanger des fichiers xml.Sans trop rentrer dans les détails je dois faire 2 serveur UDP é Arreter un thread [ par tibob51 ] <TD id=HB_Focus_Element vAlign=top width="100%" background="" height=250 UNSELECTAB Thread [ par joduak ] Salut!Je souhaiterais savoir si, quand j'exécute un thread (fonction thread2) à l'intérieur d'un thread (fonction thread1)est ce que le thread (foncti Thread, Client/Serveur VC++.Net et avec WinForms ( pas d'MFC ) [ par lacousine ] Bonjour,j'ai développé un serveur qui accept plusieurs clients avec des sockets. Voici mes problèmes: lorsque je veux mettre fin à mon serveur et qu'i perte de paquets UDP dans un thread quand l'autre thread fait un write() [ par fabricius ] Hello,Voila mon problème, ca fait bien une semaine que je suis dessus...J'ai écrit un soft qui écoute une socket UDP, qui reçoit des paquets et qui le Client UDP avec CAsyncsocket [ par underdog08 ] Bonjour,Je doit réaliser une communication client serveur UDP en mfc avec CAsyncsocket, je suis débutant en programmation et j'ai difficilement réussi Thread & Socket [ par katerson ] Bonjour tout le monde! Je travaille actuellement sur un projet serveur/client sur UDP. Mon serveur comporte 3 threads qui doivent scruter (indépenda Arreter la boucle avec ENTER [ par vlavin ] Bonjour a tous. j'ai une condition while(i<TAILLE)||(???) comment on fait pour que la deuxieme condition dans while soit une frappe sur la touche EN Meilleur solution pour serveur MMORPG. [ par LA_Tupac ] Bonjour à tous! voila ma question: Je développe actuellement mon premier jeu en réseau. Le socket d'envoi du client est en tcp et le socket d'envoi du Arreter un thread [ par romauto750 ] Bonjour à tous,J'aurai aimé savoir comment on faisait pour arrêter un thread. Je m'explique :J'ai une fonction qui appelle un thread, cependant le cod


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,061 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales