[sockets] Debloquer Accept(); [Résolu]

VoLc0m 40 Messages postés vendredi 10 janvier 2003Date d'inscription 24 avril 2008 Dernière intervention - 28 nov. 2006 à 15:59 - Dernière réponse : LUDINSKI 441 Messages postés mardi 2 décembre 2003Date d'inscription 22 mai 2012 Dernière intervention
- 29 nov. 2006 à 11:44
Bonjour,
j'ai un petit problème lors de la fermeture de mon programme.
J'ai un serveur tcp qui tourne dans un thread de mon appli de cette manière :














while (!Program



.ArretDemande)
{




TraitementCdeServeur tcs = newTraitementCdeServeur

(sock.Accept());



//On lance un thread pour effectuer la tache en paralelle

Thread tClient = newThread(newThreadStart



(tcs.TraiterCde));
tClient.Name = "tClient"



;
tClient.Start();
}
sock.Close();





sock est mon socket serveur bien entendu.

Le problème vient, lorsque je lance un thread.abort() sur ce thread serveur, il ne se ferme pas car il est constamment en écoute, bloqué sur le sock.Accept().

Mis à part un BeginAccept() y a t-il une solution pour pallier à ce probleme?

D'avance, merci beaucoup
Afficher la suite 

6 réponses

Répondre au sujet
LUDINSKI 441 Messages postés mardi 2 décembre 2003Date d'inscription 22 mai 2012 Dernière intervention - 28 nov. 2006 à 21:22
+3
Utile
Voilà, ce que j'écrierai :

while( ! Program

.ArretDemande )
{
    // Une demande de connexion a été signalée


    if(
sock.Poll( 1000000, SelectMode.SelectRead ) )
    {
       // Récupère le socket demandant à ce connecter



       TraitementCdeServeur tcs = new TraitementCdeServeur


( sock.Accept() );





       Thread tClient = newThread( newThreadStart

( tcs.TraiterCde ) );
       tClient.Name = "tClient"


;
       tClient.Start();

    }// Aucune connexion n'a été demandé au bout d'une seconde
    else
        Thread.Sleep( 100 );
}

Essayes toujours, par contre, je n'sais pas ce que fait ta classe


TraitementCdeServeur !!
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de LUDINSKI
LUDINSKI 441 Messages postés mardi 2 décembre 2003Date d'inscription 22 mai 2012 Dernière intervention - 28 nov. 2006 à 16:38
0
Utile
Salut,

Il te suffit, avant d'appeler la méthode Accept(),
de déterminer l'état de ton socket en faisant appel à la méthode Poll :

sock.Poll( 1000000, SelectMode.SelectRead );
1000000 correspond à 1 seconde !

Cette méthode retourne un booléen t'indiquant si le socket est prêt à accepter une connexion...

N'hésites pas, si tu as besoin d'éclaircissement ;)
Commenter la réponse de LUDINSKI
VoLc0m 40 Messages postés vendredi 10 janvier 2003Date d'inscription 24 avril 2008 Dernière intervention - 28 nov. 2006 à 17:16
0
Utile
J'ai besoin d'éclaircissements ;o)

Comment, avec cette méthode, lorsque le socket attend sur Accept(); le fait d'appeler Thread.Abort() fera passer le Accept(), et n'attendra pas un retour? C'est çà que je comprends pas :)

La je viens de coder en utilisant un BeginAccept et une tempo de 10ms aprés le BeginAccept, mais je suis pas sûr que ce soit très propre... Est ce que je risque de perdre des demandes de connexion? Où est ce que ces demandes sont juste stockées dans la file d'attente? (j'ai un Listen(10)).

Merci :)
Commenter la réponse de VoLc0m
VoLc0m 40 Messages postés vendredi 10 janvier 2003Date d'inscription 24 avril 2008 Dernière intervention - 29 nov. 2006 à 09:36
0
Utile
Merci, çà m'a éclairci et je trouve cette façon plus propre que mon Sleep tout seul :o)
Commenter la réponse de VoLc0m
VoLc0m 40 Messages postés vendredi 10 janvier 2003Date d'inscription 24 avril 2008 Dernière intervention - 29 nov. 2006 à 09:39
0
Utile
Juste pour info, si quelqu'un a le même souci, j'ai viré le Sleep qui ne sert donc plus à rien. Il était là à l'origine pour éviter un bouclage trop fréquent, et une utilisation CPU à 100%. Avec Poll et 1 sec d'attente, plus de problème :)
Commenter la réponse de VoLc0m
LUDINSKI 441 Messages postés mardi 2 décembre 2003Date d'inscription 22 mai 2012 Dernière intervention - 29 nov. 2006 à 11:44
0
Utile
Et ben ce fût un plaisir ;)
Commenter la réponse de LUDINSKI

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.