QuoteÜberhaupt solltest Du bei Verwendung von UDP auf jeden Fall mit Timeouts für den Empfang arbeiten
Kann mir jemand eine funktionierende Methode fuer den timeout sagen ?
Ich habe mit folgendem code rumexperimentiert, das funktioniert aber nicht sauber
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
## Sende-Empfangsschleife
while(1) {
fill_with_tie(); ## Sendedaten aus Datei lesen
print "Laenge sendung: length($sendung) \n\n";
if ( length($sendung) == 0 ) {
$sendung = 'init';
} # if
print "sendung: $sendung\n\n";
#Variante 1
#send(SOCK, $sendung, 0, $dest_addr) or die "send() gescheitert: $!\n";
#Variante 2
$sock->send($sendung) or die "sendung gescheitert: $!\n";
#=pod
$startzeit = scalar time();
print "start: $startzeit \n";
$hilfe = $startzeit +3 ;
print "hilfe: $hilfe \n";
$timeout = scalar time();
unless ( $hilfe < $timeout ) {
#sleep(4);
print "in Schleife \n\n";
$timeout = scalar time();
print "timeout:: $timeout \n";
$sock->recv($data, MAX_MSG_LEN) or die "empfang gescheitert $!\n";
# recv(SOCK, $data, MAX_MSG_LEN, 0) or die "receive() gescheitert $!";
}
#=cut
=pod
eval {
local $SIG{ALRM} = sub { die "Timeout\n" };
alarm(TIMEOUT);
$sock->recv($data, MAX_MSG_LEN) or die "empfang gescheitert $!\n";
alarm(0);
};
if ($@) {
die $@ unless $@ eq "Timeout\n";
warn "Timeout !!\n";
} # if
=cut
fill_empfang_file($data); ## Empfang in Datei schreiben
chomp($data);
print "Empfangen: $data \n";
sleep(3);
} # while
Dieser code sollte message verschicken und bis zu einem timeout auf Empfang schalten, danach wieder verschicken, egal ob server lauscht oder nicht.
QuoteWas bei Deinem Code merkwürdig ist, ist die Tatsache, dass der Server send ohne eine Zieladresse verwendet.
Der recv()-Aufruf merkt sich die Quelladresse des zuletzt empfangenen Datagramms, dann benutzt send() daraus die Adresse, ist Eigenheit von IO::Socket.
UDP IST verbindungloses Protokoll.