Perl: Wie man IO::Socket::INET-timeout nach X Sekunden?
Ich versuche, eine Verbindung zu einigen Rechner mit ungültigen port, und ich will get timeout nach X Sekunden. Wie macht man das ?
Mein code:
$sock = new IO::Socket::INET(
PeerAddr => $_[0],
PeerPort => $_[1],
Proto => 'tcp',
Timeout => 2
);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie überprüfen Sie den code, den Sie sehen (kopiert habe ich es von meinem Ubuntu 10.04) :
Offenbar der timeout-Sachen auskommentiert ist, so dass expleins warum wird es ignoriert.
Fand ich eine post aus 2003, wo dies diskutiert wurde. Ein Vorschlag (unten) wurde um den sockel öffnen in einem eval-block wird beendet durch ein Alarmsignal :
Nicht sehr elegant, aber wenn es funktioniert...
Lassen Sie uns überprüfen Sie mit einem langsamen server und ungeduldig client :
wenn wir dies ausführen:
So ignoriert es die 2-Sekunden-timeout und läuft für die vollen 5 Sekunden.
Nun der andere ungeduldig client :
~
und es läuft :
Yep, diese timeouts nach 2 Sekunden wie erwartet.
Timeout
- Attribut wird nicht ignoriert, aber es wird in den Konstruktor derIO::Socket
, nichtIO::Socket::INET
. Dies ist ein guter workaround, aber, und sowas ist erforderlich für Windows.alarm 0
Anrufe in die aufgeführten Beispiele sind nicht "race condition "Schutz" per se. Statt diese Technik (das isteval { alarm $n; ...; alarm 0; }; alarm 0
) ist so konzipiert, erholen Sie sich vom code, derdie()
s etwas anderes ist als eine vom Benutzer installiert ALRM handler, der würde aus dereval{}
- block ohne das Abbrechen der ausstehenden alarm. (Natürlich, die Erholung in diesem Fall ist selbst rassig, aber das ist eine andere Geschichte.)