[sockets] Debloquer Accept();

Résolu
VoLc0m Messages postés 40 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 24 avril 2008 - 28 nov. 2006 à 15:59
LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 - 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

6 réponses

LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
28 nov. 2006 à 21:22
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 !!
3
LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
28 nov. 2006 à 16:38
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 ;)
0
VoLc0m Messages postés 40 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 24 avril 2008
28 nov. 2006 à 17:16
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 :)
0
VoLc0m Messages postés 40 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 24 avril 2008
29 nov. 2006 à 09:36
Merci, çà m'a éclairci et je trouve cette façon plus propre que mon Sleep tout seul :o)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
VoLc0m Messages postés 40 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 24 avril 2008
29 nov. 2006 à 09:39
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 :)
0
LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
29 nov. 2006 à 11:44
Et ben ce fût un plaisir ;)
0
Rejoignez-nous