Thread win32 udp server (5 answers)
Opened by hudo at 2007-08-09 04:12

hudo
 2007-08-10 13:38
#97878 #97878
User since
2003-11-20
72 Artikel
BenutzerIn
[default_avatar]
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
Code: (dl )
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.
Quote
Was 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.

View full thread win32 udp server