Schrift
[thread]9001[/thread]

Timeout ohne ARLM?

Leser: 1


<< >> 4 Einträge, 1 Seite
Gast Gast
 2007-05-12 19:17
#76666 #76666
Hi,
gibt es eine Möglichkeit einen Prozess z.b. nach 10 Sekunden zu beenden?

wenn beim recv eines udp Paketes nichts ankommt wartet er ja ewig -> Skript bleibt hängen...

$SIG(ARLM) geht bei recv unter windows nicht wirklich (wurde mir von einer 2. person schon bestätigt)

http://www.perlunity.de/cgi-bin....=8&pn=0

wie kann ich anders einen timeout erzeugen?

Edit betterworld: URL gefixt (Spamsperre)\n\n

<!--EDIT|betterworld|1179003866-->
Froschpopo
 2007-05-12 19:25
#76667 #76667
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
hm wenn du hier ein socket hast dann hilft dir vielleicht select weiter...
mit fork hab ich unter win leider nur schlechte erfahrung gemacht sonst könntest du ja selbst einen timer bauen und beim timeout einfach killen.\n\n

<!--EDIT|Froschpopo|1178983697-->
betterworld
 2007-05-13 01:10
#76668 #76668
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Entweder select verwenden, wie Froschpopo sagt, oder man kann auch fuer Sockets Timeouts setzen, sodass recv nicht ewig blockt.  Wenn das Socket mit IO::Socket erzeugt wurde, hilft da
Code: (dl )
$socket->timeout(10);

ansonsten mit setsockopt arbeiten.  Keine Ahnung, ob das unter Windows geht.
bloonix
 2007-05-13 18:41
#76669 #76669
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=betterworld,12.05.2007, 23:10]
Code: (dl )
$socket->timeout(10);
[/quote]
Hierbei sollte man nur beachten, dass $socket->accept bei
einem Timeout selbstverständlich undef zurück liefert. Falls
man also auf eingehende Requests in einer Schleife wartet,
würde das Skript beendet werden:

Code: (dl )
1
2
3
4
5
6
7
8
$socket->timeout(5);

while (my $c = $socket->accept) {
  # request Verarbeitung
}

close($socket);
exit(0);


Um das zu umgehen, kann man einfach eine weitere Schleife
drum herum benutzen:

Code: (dl )
1
2
3
4
5
6
7
8
9
$socket->timeout(5);

while ( 1 ) {
  warn "listen for incoming requests";
  while (my $c = $socket->accept) {
     warn "request comes in from ", $c->peerhost;
  }
  warn "socket timeout";
}


Ein weiterer Vorteil der äußeren Schleife ist, dass man dort
mit last oder next hinspringen kann, falls man
mit einem eingehenden Request nicht einverstanden ist.\n\n

<!--EDIT|opi|1179067349-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< >> 4 Einträge, 1 Seite



View all threads created 2007-05-12 19:17.