Leser: 1
6 Einträge, 1 Seite |
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/perl
# udp client
use strict;
use Tie::File;
use Socket qw(:DEFAULT :crlf);
$/ = CRLF;
use constant DEFAULT_HOST =>'192.168.178.23';
use constant DEFAULT_PORT =>'4712';
use constant MAX_MSG_LEN => 100;
my $host = shift ||DEFAULT_HOST;
my $port = shift ||DEFAULT_PORT;
my $counter=0;
my @array_file;
my $protocol = getprotobyname('udp');
$port = getservbyname($port, 'udp') unless $port =~ /^\d+$/;
my $data;
my $sendung;
socket(SOCK, AF_INET, SOCK_DGRAM, $protocol) or die "socket() gescheitert: $!";
my $dest_addr = sockaddr_in($port, inet_aton($host));
## 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";
send(SOCK, $sendung, 0, $dest_addr) or die "send() gescheitert: $!";
recv(SOCK, $data, MAX_MSG_LEN, 0) or die "receive() gescheitert $!";
fill_empfang_file($data); ## Empfang in Datei schreiben
chomp($data);
print "Empfangen: $data \n";
sleep(3);
} # while
sub fill_with_tie {
my $file = "meinfile.txt";
my $line;
my $elem;
$sendung ='';
if ( -e $file ) {
tie @array_file, "Tie::File", $file || die $!;
foreach $elem (@array_file) {
chomp $elem;
$sendung= $sendung ."$elem";
} ## foreach
untie @array_file;
} else {
print "Kann $file nicht oeffnen $!$/";
} ## if -s $file
} ## fill_with_tie #################
sub fill_empfang_file {
my $file="empfangsfile.txt";
my $line = @_[0];
my $elem;
print "Operator: $line \n";
open (EMPFANG, ">>$file") or die "Kann $file nicht oeffnen $!\n";
print EMPFANG "$line\n";
close(FILE);
} ## fill_empfang_file ##############
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
57
58
59
#!/usr/bin/perl -w
# udp server
use strict;
use IO::Socket;
use Cwd;
use TIE::File;
### Pfad und Hilfsvariablen intitialisieren
my $aktuellesdir;
my $dirprefix;
#my $dirbin;
my $line; ## Hilfsvariable fuer line
my $quellfile="empfangsfile.txt";
my $EMPFANG;
### UDP Variablen initialisieren
my ($sock, $PORTNO, $MAXLEN, $nachricht);
$PORTNO = 4712;
#$PORTNO = 0;
$MAXLEN = 1024;
my $laenge;
my $startzeit;
$sock = IO::Socket::INET->new ( LocalPort=>$PORTNO, Proto=>'udp')
or die "socket: $@";
print "Warte auf UDP NAchricht auf Port $PORTNO$/";
### Pfade initialisieren
$aktuellesdir=getcwd;
$dirprefix="$aktuellesdir/";
### Datei vorbereiten
my $file = "$dirprefix"."$quellfile";
my @array_quellfile;
my $n_recs_array_quellfile;
if ( -e $file ) {
tie @array_quellfile, "Tie::File", $file || die "cannot open $file $!";
$n_recs_array_quellfile = @array_quellfile;
} else {
system(`touch $file`);
tie @array_quellfile, "Tie::File", $file || die "cannot open $file $!";
$n_recs_array_quellfile = @array_quellfile;
}
while ($sock->recv($nachricht, $MAXLEN)) {
$laenge = length($nachricht);
$startzeit = scalar localtime;
print "Zeitstempel: $startzeit : Laenge: $laenge : Der Client sagte ''$nachricht''$/";
#$sock->send("Zeitstempel: $startzeit : Du sagtest: ''$nachricht'' zu mir $/");
# $sock->send("Zeitstempel: Du sagtest: ''$nachricht'' zu mir $/");
#### print "$startzeit Der Client sagte ''$nachricht''$/";
#### $sock->send("Du sagtest: ''$nachricht'' zu mir $/");
$sock->send("Zeitstempel: ''$startzeit'' : Du sagtest: ''$nachricht'' zu mir $/");
push(@array_quellfile, $nachricht);
} die "recv: $!";
untie @array_quellfile;
hudo+2007-08-09 02:19:49--[...] Nun ist es so das man den server zuerst starten muß, ist das normal ?
QuoteDesweiteren schickt der client nur ein request und bricht dann mit einer Fehlermeldung (unknown error) bei der recv Zeile ab.
Wenn jedoch im server die zwei Zeilen mit #### davor benutzt werden, statt der jetzigen print und sock->send Zeile,
laeuft der client wie erwartet unendlich, schickt staendig requests und empfaengt sauber.
Was ist da das Problem ?? Wo die Aenderung eigentlich nur einige strings mehr sind ($startzeit, $laenge ) !!
[...]
QuoteÜberhaupt solltest Du bei Verwendung von UDP auf jeden Fall mit Timeouts für den Empfang arbeiten
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
QuoteWas bei Deinem Code merkwürdig ist, ist die Tatsache, dass der Server send ohne eine Zieladresse verwendet.
hudo+2007-08-10 11:38:58--[...] Kann mir jemand eine funktionierende Methode fuer den timeout sagen ?
Ich habe mit folgendem code rumexperimentiert, das funktioniert aber nicht sauber [...]
Quote[...] Der recv()-Aufruf merkt sich die Quelladresse des zuletzt empfangenen Datagramms, dann benutzt send() daraus die Adresse, ist Eigenheit von IO::Socket. [...]
6 Einträge, 1 Seite |