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

ITobiI
 2015-09-23 12:25
#182357 #182357
User since
2015-09-10
70 Artikel
BenutzerIn
[default_avatar]
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
-------------------------
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
#!/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();


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
#!/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