| Thread Fehlerfreie Übertragung einer Datei
(74 answers) Opened by
ITobiI
at 2015-09-15 17:14
 
View full thread Fehlerfreie Übertragung einer Datei
User since2015-09-10
 70
Artikel
 BenutzerIn
 
 ![[default_avatar]](/battie/theme/default/default_avatar.gif)  
Hi, also ich hab versucht das umzusetzen was ihr mir gesagt habt aber es treten noch Fehler auf, ich sag erstmal in Klartext was ich vor hab, nur zum Vergleich, den Start des Sockets unterschlage ich einfach mal: 
------Client------ 
-> Datei öffnen und zippen 
->Datei in Array einlesen 
->sicherstellen das alle Datenpakete gleich groß sind 
-> Anzahl der Elemente festlegen 
-> Array an Server senden 
-> Auf Rückantwort von Server Warten und falls notwendig noch einmal senden 
-----Server------ 
->Datei empfangen 
->überprüfen ob Datei vollständig angekommen ist 
->falls notwendig erneut Datei empfangen 
->Array entpacken 
->Array sortieren 
->Array ausgeben 
-------------------------
 
12
 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
#!/usr/bin/perl -w
 #UDP_Client.pl
 
 #Hartych, Tobias EIT 4056051
 #Dreißig, Tobias EIT 40?????
 
 use Time::HiRes qw(gettimeofday);
 use Archive::Zip;
 
 #Module importieren
 #strict macht debugging einfacher
 use strict 'vars';
 
 #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 @name;
 $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 == 'j')
 {
 $zip = Archive::Zip->new();
 $DIR = "/root/Documents/Socket-Programmierung_2/Datei";
 opendir(DIR,$DIR) or die "Kann aktuelles Verzeichnis nicht oeffnen: $!\n";
 @name = readdir(DIR) or die "Kann Verzeichnis nicht lesen:$!\n";
 
 foreach $fileName (@name)
 {
 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 (DATEI);
 
 #Schließe Socket
 $socket -> close();
 
12
 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
#!/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 strict 'refs';
 
 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 == '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);
 
 }
 
 #Schließe Socket
 $socket -> close();
 |