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

ITobiI
 2015-09-27 11:46
#182408 #182408
User since
2015-09-10
70 Artikel
BenutzerIn
[default_avatar]
Hi, also ich hab es jetzt so weit hinbekommen das keine Fehler mehr angezeigt werden. Allerdings wird die Hauptschleife einfach durchlaufen ohne das etwas gemacht wird, bis auf die Abfrage ob das Programm beendet werden soll. Hier die aktuellen Scripte:
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
#!/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);
my ($Dateien,$VerzPfad,$strAblageVer,$dateien,$strVerzeichnis);
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";

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

#Hauptschleife
while($end eq "j")
{
#definiere ip
$peer_address = $socket->peerhost();
#definiere port
$peer_port = $socket->peerport();

#Empfange Anzahl der zu sendenden Elemente
$socket->recv($Anzahl_Elemente,1024);

#Empfange Daten von Client
$socket->send($_) for (@data);

#Empfange und überprüfe Daten
while ($Anzahl_Elemente != @data)
{
$Sende_erneut = 1;
$socket->send($Sende_erneut);

#Empfange Anzahl der zu sendenden Elemente
$socket->recv($Anzahl_Elemente,1024);
}
$strVerzeichnis = "Verzeichnis_A";
$strAblageVer = "Verzeichnis_B";

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

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

#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>;
}

#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
#!/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);
my ($Anzahl_Elemente,$block,$fh,$Sende_erneut,$DIR,$zip,$fileName);
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";


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

#Hauptschleife
while ($end eq "j")
{
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);
}

#Laenge des Array festlegen
$Anzahl_Elemente = @data;

#Laenge des Array an Server senden
$socket->send($Anzahl_Elemente, 1024);

$Sende_erneut = 0;

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

while($Sende_erneut == 1)
{
#sende Datenpakete zu Server
$socket->send($_) for (@data);

#überprüfe ob Server Daten erhalten hat
$socket->recv($Sende_erneut,1024);

#Endzeit setzen
($start_sec, $start_usec) = gettimeofday();
}
#Sendezeit ermitteln
$timeDelta = ($end_usec - $start_usec)/1000 + ($end_sec - $start_sec)*1000;
print "Die Sendezeit betraegt: $timeDelta ms";

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

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

View full thread Fehlerfreie Übertragung einer Datei