Thread Fehlerfreie Übertragung einer Datei
(74 answers)
Opened by
ITobiI
at 2015-09-15 17:14
User since 2015-09-10
70
Artikel
BenutzerIn
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
-------------------------
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
#!/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();
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
#!/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();
View full thread Fehlerfreie Übertragung einer Datei
|