Perl: Comment obtenir IO::Socket::INET expire au bout de X secondes?
Je suis en train d'essayer de se connecter à certains d'accueil, en utilisant des données invalides de port, et je veux obtenir expire au bout de X secondes. Comment faire ?
Mon code:
$sock = new IO::Socket::INET(
PeerAddr => $_[0],
PeerPort => $_[1],
Proto => 'tcp',
Timeout => 2
);
OriginalL'auteur code2be | 2010-08-25
Vous devez vous connecter pour publier un commentaire.
Si vous vérifiez le code, vous verrez (je l'ai copié de mon Ubuntu 10.04) :
Apparemment, le délai d'attente choses est commenté pour que expleins pourquoi il est ignoré.
J'ai trouvé un post datant de 2003 où cela a été discuté. Une suggestion (en bas) a été l'ouverture de la socket dans un bloc eval qui se termine par un signal d'alarme :
Pas très élégante, mais si ça marche...
Nous allons vérifier avec un serveur lent et impatient client :
si nous lançons cette:
De sorte qu'il ignore le délai d'attente de 2 secondes et fonctionne pendant 5 secondes.
Maintenant les autres impatient client :
~
et en l'exécutant :
Oui, oui, c'délais d'attente au bout de 2 secondes, comme prévu.
Timeout
attribut n'est pas ignoré, mais il est utilisé dans le constructeur deIO::Socket
, pasIO::Socket::INET
. C'est une bonne solution si, et quelque chose comme ceci est nécessaire pour Windows.C'est vrai, mais il est commenté dans la configurer sous de IO::Socket::INET. AFAICS il est défini, mais jamais utilisé dans ::INET.
Merci, cela a fonctionné pour moi. Mais, Pourquoi cette partie est commentée dans la source ?
Aucune idée, je pense que c'est un cas de "devrait fonctionner, mais ne sera pas".
Notez que le deuxième
alarm 0
appels dans les exemples donnés ne sont pas "race condition "protection" soi. Au lieu de cela, cette technique (qui est,eval { alarm $n; ...; alarm 0; }; alarm 0
) est conçu pour récupérer à partir du code quedie()
s d'autre chose qu'un utilisateur a installé ALRM gestionnaire, qui devaient quitter laeval{}
bloc sans annuler l'alarme en cours. (Bien sûr, la récupération, dans ce cas, est lui-même racé, mais c'est une autre histoire.)OriginalL'auteur Peter Tillemans