perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 30
Click for quality!




08.02.2012 / 22:18

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragUDP - Client Timeout scripten?
Seitenanfang
Hi,
ich schicke ein UDP Paket zu einen Server und hole mir das über recv. wenn der server mir aber nun warum auch immer kein Paket zurückschickt bleibt mein script hängen!

ich habe das recv in einer for schleife und möchte das er diese nochmal durchläuft wenn vom Server innerhalb von 5 Sekunden keine Antwort gekommen ist.

wie ist sowas möglich?

ich danke schon mal euch experten

Datum: 08.05.2007-18:03

Beitragre: UDP - Client Timeout scripten?
Seitenanfang
kann mir den keiner helfen?
ich bin schon am verzweifeln :(

Datum: 10.05.2007-17:34

Beitragre: UDP - Client Timeout scripten?
Seitenanfang
Unter Unix-basierden System verwendet man den Signalhandler 'ALRM', keine Ahnung ob man sich unter Win32-Systemen darauf verlassen kann. Hab es so eben mit ActivePerl 5.8.8 unter Windows XP Professional getestet - dies funktioniert.

#!/usr/bin/perl

use strict;
use warnings;

my $max_retry = 3; # number of retries
my $timeout = 5; # seconds

{
local $SIG{'ALRM'} = sub { print "recv() timeout [#$_]: retrying...\n" };

for(1 .. $max_retry) {
alarm $timeout;

sleep 10; # simulates blocked recv()

alarm 0;
}
}


Als erstes setzt du den Alarm-Signal-Handler in dem du $SIG{'ALRM'} die entsprechende Code-Referenz zuweist.
Dann rufst du 'alarm' mit der Anzahl an Sekunden auf, die gewartet werden sollen bis der Timeout auftritt. Wenn du 'alarm' den Wert 0 (Null) uebergibst wird der Timer gestoppt.

Datum: 10.05.2007-23:00

Beitragre: UDP - Client Timeout scripten?
Seitenanfang
Nachtrag:

Hier noch ein Link zum Perl-Kochbuch, jedoch die englische Version, aber eine Ausgabe in der favorisierten Sprache sollte man eh zuhause liegen haben ;)

http://www.unix.org.ua/orelly/perl/cookbook/ch17_06.htm

Datum: 10.05.2007-23:04

Beitragre: UDP - Client Timeout scripten?
Seitenanfang
ich danke dir nur leider wird doch so das program durch sig alrm gekillt ich möchte aber wenn der timeout erreicht ist next ausführen...
wie ist das damit möglich?

Datum: 11.05.2007-16:35

Beitragre: UDP - Client Timeout scripten?
Seitenanfang
Das Programm wird in keinsterweise gekillt, hast du mal den Code von oben ausgefuehrt?!

Wenn du in den Signalhandler ein 'die' oder ein 'exit' setzt, dann wuerde das Script sich beenden.

Datum: 11.05.2007-16:49

Beitragre: UDP - Client Timeout scripten?
Seitenanfang
also ich habs eben eingebaut...
dein script so wie es oben steht läuft bei mir mit den echten recv leider nicht.

eval {
local $SIG{'ALRM'} = sub { print "recv() timeout\n" };
alarm 6;
$portaddr = recv(SOCKET, $resp, 1024, 0);
($port, $ipaddr) = sockaddr_in($portaddr);
$host = gethostbyaddr($ipaddr, AF_INET);
alarm 0;
};
oder auch

{
local $SIG{'ALRM'} = sub { print "recv() timeout\n" };
alarm 6;
$portaddr = recv(SOCKET, $resp, 1024, 0);
($port, $ipaddr) = sockaddr_in($portaddr);
$host = gethostbyaddr($ipaddr, AF_INET);
alarm 0;
}

übersehe ich da einen fehler?

Datum: 11.05.2007-19:39

Beitragre: UDP - Client Timeout scripten?
Seitenanfang
Das folgende Testscript habe ich so eben unter Linux getestet, dort tut es seinen Dienst so wie es soll. Unter Windows sieht es anders aus, da laesst sich recv() vermutlich nicht unterbrechen.


#!/usr/bin/perl
$|++;

use strict;
use warnings;

use IO::Socket;

my $max_len = 1024;
my $max_retries = 3;
my $timeout = 6; # seconds

my $sock = IO::Socket::INET->new(Proto => 'udp',
LocalPort => 1234)
or die "Couldn't bind: $@\n";

for(1 .. $max_retries) {
eval {
$SIG{'ALRM'} = sub { warn "recv() timed out!\n" };

alarm $timeout;

my $msg;
$sock->recv($msg, $max_len) or die "recv: $!";
print $msg;

alarm 0;

return 1;
};
}

Wenn's die Zeit erlaubt bleib ich in den naechsten Tagen mal an diesen Problem dran, event. laesst sich da ja doch noch ein Workaround finden.

Datum: 11.05.2007-23:52

Beitragre: UDP - Client Timeout scripten?
Seitenanfang
das wäre sehr nett von dir.
ich wüste sonst nicht wie ich das script fertig stellen soll

wenn du was hinbekommen hast wäre ich dir sehr dankbar das hier zu posten

Datum: 12.05.2007-13:31

-






-
-