Sockets et Threads sont sur un bateau

Sockets et Threads sont sur un bateau - Perl - Programmation

Marsh Posté le 26-08-2010 à 12:06:13    

J'essaie de créer un client DHCP en Perl. L'objectif étant que je puisse interroger un serveur DHCP avec un timeout réglable, et spécifier un certain nombre de tentatives max.
 
Pas de soucis particuliers pour envoyer / recevoir les requêtes via des sockets. Le souci qui se pose pour moi est de limiter le(la-les, je sais jamais si c'est masculin ou féminin) socket en réception pour qu'il n'écoute qu'un nombre déterminé de secondes.
 
Je me suis donc dit, utilisons les threads. Je lance un thread contenant la logique de mon client DHCP, puis dans le programme principal je fais un sleep() puis j'essaie d'envoyer un signal au thread afin qu'il stoppe.
 
En code, ca donne ca :
 


 
sub ClientDHCP{
 $SIG{'TERM'} = sub { threads->exit(); };
 
 #Code d'envoi / réception de paquets, faisant appel a d'autres fonctions, notamment un socket en écoute pour recevoir la réponse du DHCP.
 
 
}
 
my $client = threads->new(\&ClientDHCP);
sleep $o_timeout;
 
$client->kill('TERM');
$client->join();
exit 0;
 


 
Souci, cela ne marche pas. Le join() bloque indéfiniment.
 
Deuxième question subsidiaire : y'a quoi de mieux pour nettoyer mon thread proprement avant de quitter ? je pensais mettre les sockets ouverts dans un tableau, pour pouvoir les close() avant de quitter.


Message édité par ccp6128 le 26-08-2010 à 12:07:13
Reply

Marsh Posté le 26-08-2010 à 12:06:13   

Reply

Marsh Posté le 26-08-2010 à 13:25:56    

use Coro;
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-08-2010 à 17:24:30    

Je vais regarder ca, mais je reste curieux de savoir pourquoi ce que j'essaie de faire avec des threads ne marche pas.

Reply

Marsh Posté le 31-08-2010 à 15:34:40    

Up. C'est moi ou Coro n'est pas adapté a ce que je veux faire ? A priori c'est adapté pour faire du multithread coopératif, et j'ai besoin d'un comportement préemptif.

Reply

Marsh Posté le 31-08-2010 à 16:20:34    

En lisant un peu la doc, j'ai plutôt l'impression que ton code devrait plutôt ressembler à ceci:
my $client = threads->new(\&ClientDHCP);
if ($client->is_running()) {
   sleep($o_timeout);
}
if ($client->is_joinable()) {
   $client->join();
}  
else {
  $client->kill('TERM')->detach();
}
exit 0;  
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 31-08-2010 à 16:55:37    

That's right, ca a l'air de marcher beaucoup mieux. Merci.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed