UDP - 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

|
re: UDP - Client Timeout scripten?
|
Seitenanfang |
kann mir den keiner helfen? ich bin schon am verzweifeln :(
Datum: 10.05.2007-17:34

|
re: 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

|
re: 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

|
re: 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

|
re: 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

|
re: 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

|
re: 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

|
re: 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

|