[sockets] Debloquer Accept();

[Résolu]
Signaler
Messages postés
40
Date d'inscription
vendredi 10 janvier 2003
Statut
Membre
Dernière intervention
24 avril 2008
-
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
-
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

6 réponses

Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
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 !!
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
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 ;)
Messages postés
40
Date d'inscription
vendredi 10 janvier 2003
Statut
Membre
Dernière intervention
24 avril 2008

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 :)
Messages postés
40
Date d'inscription
vendredi 10 janvier 2003
Statut
Membre
Dernière intervention
24 avril 2008

Merci, çà m'a éclairci et je trouve cette façon plus propre que mon Sleep tout seul :o)
Messages postés
40
Date d'inscription
vendredi 10 janvier 2003
Statut
Membre
Dernière intervention
24 avril 2008

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 :)
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
Et ben ce fût un plaisir ;)