Thread Fehlerfreie Übertragung einer Datei (74 answers)
Opened by ITobiI at 2015-09-15 17:14

ITobiI
 2015-09-29 19:40
#182425 #182425
User since
2015-09-10
70 Artikel
BenutzerIn
[default_avatar]
Hi, ich schon wieder. Als mir wurden folgende Fehlermeldungen ausgegeben:
-------------------Client-----------
Use of uninitialized value $end_usec in subtraczion (-) at root/.../UDP_Client.pl line 112.
Use of uninitialized value $end_sec in subtraczion (-) at root/.../UDP_Client.pl line 112.
-------------------Server-----------
Use of uninitialized value $VerzPfad in concatenation (.) or string at root/.../UDP_Server.pl line 90.
Use of uninitialized value $VerzPfad in concatenation (.) or string at root/.../UDP_Server.pl line 90.
ERROR chdir ".Verzeichnis_B" (No such file or directory)
Hier die aktuellen Skripte:
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/usr/bin/perl -w

#UDP_Server.pl

#Hartych, Tobias EIT 4056051
#Dreißig, Tobias EIT 40?????

#Module importieren
use strict 'vars'; #strict macht debugging einfacher
use warnings;

use IO::Socket::INET;#Modul wird benoetigt um Netzwerkfunktionen zu nutzen

#auto-flush
$| = 1;

#Variablen deklarieren
my ($end,$socket,$peer_address,$peer_port,$n,$i,$Anzahl_Elemente,$Sende_erneut,$Bestaetigung,$checksum_Client,$checksum_Server);
my ($VerzPfad,$strAblageVer,$dateien,$strVerzeichnis,$daten);
my (@data,@sortdata);

my $ip = $ARGV [0] || "127.0.0.1"; #erste Paramenter wird in $ipaddr eingespeichert
my $port = $ARGV [1] || "9999"; #zweite Paramenter wird in $ipaddr eingespeichert

#Socket erschaffen zur Kommunikation mit Client
$socket=new IO::Socket::INET
(
LocalHost =>$ip,#LocalHost von $socket ist eingegebener Paramenter $ip
LocalPort=>$port,#LocalPort von $sock ist eingegebener Paramenter $port
Proto=>'udp'#Transportprotokoll: UDP
);
die "Konnte keine Verbindung herstellen: $!\n" unless $socket; #wenn fehlgeschlagen dann schließen

print "UDP Server bereit und wartet auf eine Verbingung mit Port $port\n";

#Hauptschleife
while(1)
#do
{
#Empfange Prüfsumme von Client
$socket->recv($checksum_Client,1024);
#definiere ip
$peer_address = $socket->peerhost();
#definiere port
$peer_port = $socket->peerport();

#Empfange und überprüfe Daten
do
{
#Bestätige nicht erfolgreiches Senden
$Bestaetigung = 0;
$socket->send($Bestaetigung);

$socket->recv($daten,1024);

#Bilde Prüfsumme nach Empfang der Daten
$checksum_Server = unpack ("%16C*", $daten);
}
while ($checksum_Client != $checksum_Server);

#Bestätige erfolgreiches Senden
$Bestaetigung = 1;
$socket->send($Bestaetigung);

$strVerzeichnis = "Verzeichnis_A";
$strAblageVer = "Verzeichnis_B";

#Wandle String in Array um
@data = join(", ", $daten);

#Kopieren
use File::Copy;
foreach $dateien (@data)
{
copy($strVerzeichnis.'/'.$dateien,$strAblageVer.'/'.$dateien);
}

chdir($VerzPfad.$strAblageVer) or die (qq#ERROR chdir "$VerzPfad.$strAblageVer" ($!)\n#); #line 90

#Entpacke
foreach $dateien (@data)
{
system("/usrbin/unzip", $VerzPfad.$strAblageVer.'/'.$dateien) == 0 or die "Systemfehler: $?";
#zip-Dateien löschen
unlink($VerzPfad.$strAblageVer.'/'.$dateien);
}

@sortdata = sort @data;

#Gib Datei aus
print join(",",@sortdata);

#Abfrage ob Programm beenden
print "Wenn Programm durchgeführt werden soll dann bitte j eingeben, ansonsten beliebiges anderes Zeichen eingeben\n";
$end = <STDIN>;
}
#while($end = 'j');

#Schließe Socket
$socket -> close();

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/perl -w

#UDP_Client.pl

#Hartych, Tobias EIT 4056051
#Dreißig, Tobias EIT 40?????

use Time::HiRes qw(gettimeofday);

#Module importieren
#strict macht debugging einfacher
use strict 'vars';
use warnings;

#Modul wird benoetigt um Netzwerkfunktionen zu nutzen
use IO::Socket::INET;

#auto-flush
$| = 1;

#Variablen deklarieren
my ($socket,$ip,$port,$end,$start_sec,$start_usec,$end_sec,$end_usec,$timeDelta,$checksum_Client);
my ($Anzahl_Elemente,$block,$fh,$Sende_erneut,$DIR,$zip,$fileName,$daten,$Bestaetigung);
my (@data);
$ip = $ARGV [0] || "127.0.0.1"; #erster Paramenter wird in $ipaddr eingespeichert
$port = $ARGV [1] || "9999"; #zweiter Paramenter wird in $ipaddr eingespeichert


#Socket erschaffen zur Kommunikation mit Server
$socket=new IO::Socket::INET
(

PeerAddr=>$ip, #PeerAddr von $sock ist eingegebener Paramenter $ipaddr

PeerPort=>$port, #PeerPort von $sock ist eingegebener Paramenter $port

Proto=>'udp' #Transportprotokoll: UDP

);

die "Konnte keine Verbindung herstellen: $!\n" unless $socket;


print "Mit $ip verbunden !\n";

#Hauptschleife
#do
while(1)
{
use Archive::Zip;
$zip = Archive::Zip->new();
$DIR = "/root/Documents/Socket-Programmierung_2/Datei";
opendir(DIR,$DIR) or die "Kann aktuelles Verzeichnis nicht oeffnen: $!\n";
@data = readdir(DIR) or die "Kann Verzeichnis nicht lesen:$!\n";

foreach $fileName (@data)
{
if ($fileName =~ /.txt/ )
{
$zip->addFile($fileName);
}
}
$zip->writeToFileNamed("result.zip");

#Datei Array einlesen und sicherstellen das Datenpakete gleich groß sind
open ($fh,'<:raw','result.zip') or die ("ERROR OPEN result.zip ($!)\n");
while (read($fh,$block,1024))
{
push(@data,$block);
}

#Wandle Array in String um
$daten = join(", ", @data);

#Prüfsumme ermitteln
$checksum_Client = unpack ("%16C*", $daten);

#Prüfsumme an Server senden
$socket->send($checksum_Client, 1024);

$Bestaetigung = 0;

#Startzeit setzen
($start_sec, $start_usec) = gettimeofday();

while($Bestaetigung == 0)
{
#Bestaetigung senden
$socket->recv($Bestaetigung,1024);

if($Bestaetigung == 0)
{
#sende Datenpakete zu Server
$socket->send($daten);
}
}

#Endzeit setzen
($start_sec, $start_usec) = gettimeofday();

#Sendezeit ermitteln
$timeDelta = ($end_usec - $start_usec)/1000 + ($end_sec - $start_sec)*1000; #line 112
print "Die Sendezeit betraegt: $timeDelta ms\n";

#Abfrage ob Programm beenden
print "Wenn Programm durchgeführt werden soll dann bitte j eingeben, ansonsten beliebiges anderes Zeichen eingeben\n";
$end = <STDIN>;
}
#while($end eq 'j');

#Schließe DIR
close (DIR);

#Schließe Socket
$socket -> close();

View full thread Fehlerfreie Übertragung einer Datei