$socket->send($array[0]);
$socket->recv($array[0],1024);
@array = split(......);
1 2 3 4 5 6 7 8 9 10 11 12 13
use bytes; Für jedes Array-Element erzeuge 4 Bytes mit der Längenangabe, z.B. so pack 'N', length($elem); dann hänge das Element selbst hintendran. Also: $bin .= pack('N', length($elem)).$elem; Zum Wiederherstellen des Arrays lese aus dem Handle im Schleifenkörper 4 Bytes, so bekommst Du mit unpack 'N', $buffer die Original-Länge des folgenden Array-Elements nun lese mit der ermittelten Längenangabe das Element selbst aus dem Handle # Handle == Socket
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#Empfange und überprüfe Empfang Daten
for($i = 0; $i < $laenge_Client; $i++)
{
$Bestaetigung_laenge_daten = 0;
#Empfange Daten
do
{
#sende Bestätigung für nicht erfolgreichen Empfang des Datenpakets
$connection->send($Bestaetigung_laenge_daten);
#Empfange Daten und löse Timeout aus wenn Datenpaket verloren geht
$connection->recv($daten[$i],1024);
#Bilde Länge der empfangenen Daten
$laenge_Server = length($daten[$i]);
}
while($laenge_Server != 1024);
$Bestaetigung_laenge_daten = 1;
#sende Bestätigung für erfolgreichen Empfang des Datenpakets
$connection->send($Bestaetigung_laenge_daten);
}
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
#String in Array umwandeln
@daten = split('-',$zip_daten);
#Array in gleich große Elemente aufteilen
??Array in gleich Große Elemente der Größe 1024 aufteilen??
#Länge des Arrays ermitteln
$laenge_Client = @daten;
#Sende Länge der Daten zu Server
$socket->send($laenge_Client);
do
{
#Bestaetigung erhalten
$socket->recv($Bestaetigung_checksum_daten,2);
for($i = 0; $i < $laenge_Client; $i++)
{
do
{
#empfange Bestätigung für Empfang des Datenpakets
$socket->recv($Bestaetigung_laenge_daten,2);
#sende Datenpakete zu Server
$socket->send($daten[$i]);
}
while($Bestaetigung_laenge_daten == 0);
}
}
while($Bestaetigung_checksum_daten == 0);
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
#!/usr/bin/perl # Dateien empfangen und serverseitig speichern use strict; use warnings; use IO::File; use File::Copy; chdir "/tmp"; # Request-Header x-upload: filename if( my $filename = $ENV{HTTP_X_UPLOAD} ){ my $fh = IO::File->new; $fh->open("/tmp/$filename", O_CREAT|O_BINARY|O_TRUNC|O_RDWR) or die $!; copy *STDIN, $fh; my $size = -s $fh; $fh->close; print "Content-Length: 0\n", "Content-Type: text/plain\n\n", "$filename==$size\n\n"; # Letzteres wird aus der Response geparst zu einem Hash } else{ print "Content-Length: 0\n", "Content-Type: text/plain\n\n", "Done"; }
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
#!/usr/bin/perl use strict; use warnings; use IO::Socket; use IO::File; use Data::Dumper; binmode STDOUT; my $sock = IO::Socket::INET->new('localhost:80') or die $!; # Lade ein paar Textdateien hoch my $check = {}; # hashref zum Gegenchecken my @files = <*.txt>; foreach my $filename(@files){ my $content = do{ my $fh = IO::File->new; $fh->open($filename, O_BINARY|O_RDONLY) or die $!; read($fh, my $buffer, -s $fh); $check->{$filename} = -s $fh; $fh->close; $buffer; }; # Request-Header x-upload: filename print $sock <<"EOT~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~EOT"; PUT /cgi-bin/put.cgi HTTP/1.1 Host: localhost Connection: Keep-Alive Content-Length: @{[length($content)]} x-upload: $filename $content EOT~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~EOT } # Ergebnis abfragen # Request print $sock <<"EOT~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~EOT"; GET /cgi-bin/put.cgi HTTP/1.1 Host: localhost Connection: Close EOT~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~EOT # Response my $response = ''; $response .= $_ while <$sock>; # Ausgabe Hash: Dateiname => Dateigröße my $h = { $response =~ /(.*)==(\d+)/g }; print Dumper $response, $h, $check;
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/usr/bin/perl -w
#TCP-Server
#Hartych, Tobias EIT 4056051
#Dreißig, Tobias EIT 4056501
use strict; #strict macht debugging einfacher
use IO::Socket::INET; #nutze Modul IO::Socket::INET um einen neuen Socket zu erschaffen
#Variablen deklarieren
my ($socket,$connection,$end);
my($peeradr,$peerport);
my ($Bestaetigung_daten,$checksum_Client,$checksum_Server,$fh,$sort_daten,$Bestaetigung_checksum);
my ($unzip_daten,$zip_daten,$status,$UnzipError,$laenge_Client,$laenge_Server,$SIG);
my $NPort = $ARGV [1] || "9999"; #zweiter Paramenter wird in $NPort eingespeichert
my $ipAddress = $ARGV [0] || "127.0.0.1"; #erster Paramenter wird in $ipAddress eingespeichert
$socket = new IO::Socket::INET
(
LocalHost => $ipAddress, #LocalHost von $socket ist eingegebener Paramenter $ipAddress
LocalPort => $NPort, #LocalPort von $socket ist eingegebener Paramenter $NPort
Proto => 'tcp', #Transportprotokoll: TCP
Listen => 5, #maximale Anzahl von Client's ist 5
Reuse => 1
);
die "Fehler beim erstellen des Socket's: $!\n" unless $socket;
print "Warte auf Verbindung mit Client ..\n";
#Warte auf Verbindung zum Client / Akzeptiere eingehende Client Verbindung
$connection = $socket->accept();
$peeradr = $connection->peerhost();
$peerport = $connection->peerport();
print "TCP Server bereit und wartet auf eine Verbingung mit Port $NPort\n";
#Hauptschleife
while(1)
{
#Empfange Länge der Daten
$connection->recv($laenge_Client,4);
#Empfange und Prüfe Empfang Prüfsumme
do
{
#Bestätige nicht erfolgreiches Senden
$Bestaetigung_checksum = 0;
$connection->send($Bestaetigung_checksum);
#Empfange Prüfsumme von Client
$connection->recv($checksum_Client,8);
}
while (length($checksum_Client) < 4);
#Bestätige erfolgreiches Senden
$Bestaetigung_checksum = 1;
$connection->send($Bestaetigung_checksum);
print "1\n";
#Empfange und überprüfe Empfang Daten
do
{
#Bestätige nicht erfolgreiches Senden
$Bestaetigung_daten = 0;
$connection->send($Bestaetigung_daten);
print "11\n";
#Empfange Daten
do
{
#Empfang der Daten mit Timeout
eval
{
local $SIG{ALRM} =sub {die};
alarm(1);
$connection->recv($zip_daten,1024);
alarm(0);
};
#Bilde Länge der empfangenen Daten
$laenge_Server = length($zip_daten);
}
while($laenge_Client != $laenge_Server);
#Bilde Prüfsumme nach Empfang der Daten
#$checksum_Server = unpack ("%16C*", $unzip_daten);
use Digest::MD5 qw(md5_hex);
$checksum_Server = md5_hex($zip_daten);
print("Prüfsumme: $checksum_Server\n");
print "12\n";
}
while ($checksum_Client != $checksum_Server);
print "2\n";
#Bestätige erfolgreiches Senden
$Bestaetigung_daten = 1;
$connection->send($Bestaetigung_daten);
print "3\n";
#Entpacke
$unzip_daten = '';
use IO::Uncompress::Unzip qw(unzip $UnzipError);
$status = unzip \$zip_daten => \$unzip_daten or die "unzip schlug fehl: $UnzipError\n";
#Gib Datei aus
print "Daten:\n $unzip_daten";
#lösche Inhalt
$zip_daten = ();
$unzip_daten = ();
#Abfrage ob Programm beenden
print "\nWenn Programm durchgeführt werden soll dann bitte j eingeben, ansonsten beliebiges anderes Zeichen eingeben\n";
$end = <STDIN>;
chop($end);
if($end eq 'j')
{
#Programm beenden
close($socket);
exit();
}
}
#Schließe Socket -> schliesse Verbindung zum Client
$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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/perl -w
#TCP-Client
#Hartych, Tobias EIT 4056051
#Dreißig, Tobias EIT 4056501
use Time::HiRes qw(gettimeofday);
use strict; #strict macht debugging einfacher
use IO::Socket::INET; #nutze Modul IO::Socket::INET um einen neuen Socket zu erschaffen
my ($socket,$peeradr,$peerport,$end,$start_sec,$start_usec,$end_sec,$end_usec,$timeDelta,$checksum_Client,$Bestaetigung_checksum);
my ($daten,$Bestaetigung_daten,$zip_daten,$status,$ZipError,$laenge_Client,$FH);
#bekomme server-ip und server-port von Kommandozeilenparamter
$peeradr = $ARGV [0] || "127.0.0.1"; #erster Paramenter wird in $PeerAdress eingespeichert
$peerport = $ARGV [1] || "9999"; #zweiter Paramenter wird in $PeerPort eingespeichert
$socket = new IO::Socket::INET
(
PeerHost => $peeradr, #PeerAddr von $socket ist eingegebener Paramenter $PeerAdress
PeerPort => $peerport, #PeerPort von $socket ist eingegebener Paramenter $PeerPort
Proto => 'tcp', #Transportprotokoll: TCP
);
die "Fehler bei erstellen des Socket's: $!\n" unless $socket;
print "\nVerbindung mit Server erfolgreich!\n";
print "Mit $peeradr verbunden !\n";
#Hauptschleife
while(1)
{
#Datei in String einlesen
open($FH, "<", "/root/Documents/Socket-Programmierung_2/Datei/Test") or die $!;
binmode $FH;
$daten = <$FH>;
#packen
$zip_daten = '';
use IO::Compress::Zip qw(zip $ZipError);
$status = zip \$daten => \$zip_daten or die "zip schlug fehl!: $ZipError\n";
#Länge des Strings ermitteln
$laenge_Client = length($zip_daten);
#Sende Länge der Daten zu Server
$socket->send($laenge_Client);
#Prüfsumme ermitteln
#$checksum_Client = unpack ("%16C*", $daten);
use Digest::MD5 qw(md5_hex);
$checksum_Client = md5_hex($zip_daten);
$Bestaetigung_checksum = 0;
while($Bestaetigung_checksum == 0)
{
#Bestaetigung erhalten
$socket->recv($Bestaetigung_checksum,2);
if($Bestaetigung_checksum == 0)
{
#Prüfsumme an Server senden
$socket->send($checksum_Client);
print("Prüfsumme: $checksum_Client\n");
}
}
$Bestaetigung_daten = 0;
print "3\n";
#Startzeit setzen
($start_sec, $start_usec) = gettimeofday();
while($Bestaetigung_daten == 0)
{
print "31\n";
#Bestaetigung erhalten
$socket->recv($Bestaetigung_daten,2);
print "32\n";
if($Bestaetigung_daten == 0)
{
print "33\n";
#sende Datenpakete zu Server
$socket->send($zip_daten);
print "34\n";
}
}
#Endzeit setzen
($end_sec, $end_usec) = gettimeofday();
print "4\n";
#Sendezeit ermitteln
$timeDelta = ($end_usec - $start_usec)/1000 + ($end_sec - $start_sec)*1000;
print "Die Sendezeit betraegt: $timeDelta ms\n";
#lösche Inhalt
$daten = ();
$zip_daten = ();
#Abfrage ob Programm beenden
print "Wenn Programm durchgeführt werden soll dann bitte j eingeben, ansonsten beliebiges anderes Zeichen eingeben\n";
$end = <STDIN>;
chop($end);
if($end eq 'j')
{
#Programm beenden
close($socket);
exit();
}
}
#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
my
#Empfange und Prüfe Empfang Prüfsumme
do
{ #Zeile 64
print "21\n";
#Bestätige nicht erfolgreiches Senden
$Bestaetigung_checksum = 0;
$connection->send($Bestaetigung_checksum) or warn $!;
print "22\n";
#Empfange Prüfsumme von Client
if($server_socket->can_read($maxTimeout))
{
$connection->recv($checksum_Client,512) or warn $!;
}
print "Prüfsumme: $checksum_Client\n"; #Zeile 78
print "23\n";
}
while (length($checksum_Client) == 0);
1
2
3
4
5
6
7
my $Bestaetigung_checksum = 0;
use IO::Select;
$client_socket = IO::Select->new($socket);
if($client_socket->can_read($maxTimeout))
{
$socket->recv($Bestaetigung_checksum,16) or warn $!; #Zeile 85
}
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#!/usr/bin/perl -w
#UDP-Server
use warnings;
use IO::Select;
use strict 'vars'; #strict macht debugging einfacher
use IO::Socket::INET; #nutze Modul IO::Socket::INET um einen neuen Socket zu erschaffen
use POSIX;
#Variablen deklarieren
my ($socket,$end,$peer_address,$peer_port);
my ($Bestaetigung_checksum_daten,$checksum_Client,$checksum_Server,$fh,$sort_daten,$Bestaetigung_checksum,$Bestaetigung_laenge_daten,$i,$Anzahl_Pakete,$data,$server_socket);
my ($unzip_daten,$zip_daten,$status,$UnzipError,$laenge_Client,$laenge_Server);
my $maxTimeout = 1;
my @daten;
my $NPort = $ARGV [0] || "9999"; #zweiter Paramenter wird in $NPort eingespeichert
my $ipAddress = $ARGV [1] || "127.0.0.1"; #erster Paramenter wird in $ipAddress eingespeichert
$socket = new IO::Socket::INET
(
LocalHost => $ipAddress, #LocalHost von $socket ist eingegebener Paramenter $ipAddress
LocalPort => $NPort, #LocalPort von $socket ist eingegebener Paramenter $NPort
Proto => 'udp' #Transportprotokoll: UDP
);
die "Fehler beim erstellen des Socket's: $!\n" unless $socket;
print "Warte auf Verbindung mit Client ..\n";
$server_socket = IO::Select->new($socket);
print "UDP Server bereit und wartet auf eine Verbingung mit Port $NPort\n";
#Hauptschleife
while(1)
{
#Empfange Länge der Daten
$laenge_Client = '';
$socket->recv($laenge_Client,1024);
#definiere ip
$peer_address = $socket->peerhost();
#definiere port
$peer_port = $socket->peerport();
print "1\n";
#Ermittle Anzahl der Datenpakete
$Anzahl_Pakete = ($laenge_Client)/1024;
#Auf nächste Ganzzahl aufrunden
$Anzahl_Pakete = ceil($Anzahl_Pakete);
#Empfange und Prüfe Empfang Prüfsumme
do
{
print "21\n";
#Bestätige nicht erfolgreiches Senden
$Bestaetigung_checksum = 0;
$socket->send($Bestaetigung_checksum) or warn $!;
print "22\n";
#Empfange Prüfsumme von Client
if($server_socket->can_read($maxTimeout))
{
print "23\n";
$checksum_Client = '';
$socket->recv($checksum_Client,1024) or warn $!;
}
print "Prüfsumme: $checksum_Client\n";
print "24\n";
}
while (length($checksum_Client) == 0);
print "3\n";
#Bestätige erfolgreiches Senden
$Bestaetigung_checksum = 1;
$socket->send($Bestaetigung_checksum) or warn $!;
print "4\n";
#Empfange und überprüfe Empfang Daten
do
{
#Teile Client mit das Prüfsumme nicht übereinstimmt
print "5\n";
$Bestaetigung_checksum_daten = 0;
$socket->send($Bestaetigung_checksum_daten) or warn $!;
for($i=0; $i<$Anzahl_Pakete; $i++)
{
print "51\n";
$data = '';
#Empfange Daten
do
{
$Bestaetigung_laenge_daten = 0;
print "52\n";
#Bestaetige Daten keinen Inhalt enthält
$socket->send($Bestaetigung_laenge_daten) or warn $!;
#Empfang der Daten mit Timeout
if($server_socket->can_read($maxTimeout))
{
$socket->recv($data,1024) or warn $!;
}
print "54\n";
#Lege empfangene Daten in Array ab
$daten[$i] = $data;
#Bilde Länge der empfangenen Daten
$laenge_Server = length($data) or warn $!;
}
while($laenge_Server == 0);
print "55\n";
$Bestaetigung_laenge_daten = 1;
#Bestaetige Daten einen Inhalt enthält
$socket->send($Bestaetigung_laenge_daten);
$data = ();
}
print "56\n";
$zip_daten = join("",@daten) or warn $!;
#Bilde Prüfsumme nach Empfang der Daten
#$checksum_Server = unpack ("%16C*", $unzip_daten);
use Digest::MD5 qw(md5_hex);
$checksum_Server = md5_hex($zip_daten);
print("Prüfsumme: $checksum_Server\n");
print "12\n";
}
while ($checksum_Client ne $checksum_Server);
print "6\n";
#Bestätige erfolgreiches Senden der Daten
$Bestaetigung_checksum_daten = 1;
$socket->send($Bestaetigung_checksum_daten) or warn $!;
print "7\n";
#Entpacke
$unzip_daten = '';
use IO::Uncompress::Unzip qw(unzip $UnzipError);
$status = unzip \$zip_daten => \$unzip_daten or die "unzip schlug fehl: $UnzipError\n";
#Gib Datei aus
print "Daten:\n $unzip_daten";
#lösche Inhalt
$zip_daten = ();
$unzip_daten = ();
$data = ();
#Abfrage ob Programm beenden
print "\nWenn Programm durchgeführt werden soll dann bitte j eingeben, ansonsten beliebiges anderes Zeichen eingeben\n";
$end = <STDIN>;
chop($end);
if($end eq 'j')
{
#Programm beenden
close($socket);
exit();
}
}
#Schließe Socket -> schliesse Verbindung zum Client
$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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#!/usr/bin/perl -w
#UDP-Client
use warnings;
use Time::HiRes qw(gettimeofday);
use strict 'vars'; #strict macht debugging einfacher
use IO::Socket::INET; #nutze Modul IO::Socket::INET um einen neuen Socket zu erschaffen
use IO::Select;
use POSIX;
my ($socket,$peeradr,$peerport,$end,$start_sec,$start_usec,$end_sec,$end_usec,$timeDelta,$checksum_Client,$Bestaetigung_checksum,$Bestaetigung_laenge_daten,$i,$Anzahl_Pakete,$data,$Trenn_Anfang,$Trenn_Ende,$client_socket);
my ($daten,$Bestaetigung_checksum_daten,$zip_daten,$status,$ZipError,$laenge_Client,$FH);
my $maxTimeout = 1;
#bekomme server-ip und server-port von Kommandozeilenparamter
$peeradr = $ARGV [0] || "127.0.0.1"; #erster Paramenter wird in $PeerAdress eingespeichert
$peerport = $ARGV [1] || "9999"; #zweiter Paramenter wird in $PeerPort eingespeichert
$socket = new IO::Socket::INET
(
PeerHost => $peeradr, #PeerAddr von $socket ist eingegebener Paramenter $PeerAdress
PeerPort => $peerport, #PeerPort von $socket ist eingegebener Paramenter $PeerPort
Proto => 'udp' #Transportprotokoll: UDP
);
die "Fehler bei erstellen des Socket's: $!\n" unless $socket;
print "\nVerbindung mit Server erfolgreich!\n";
print "Mit $peeradr verbunden !\n";
$client_socket = IO::Select->new($socket);
#Hauptschleife
while(1)
{
$Bestaetigung_checksum = 0;
$Bestaetigung_checksum_daten = 0;
$Bestaetigung_laenge_daten = 0;
#Datei in String einlesen
open($FH, "<", "/root/Documents/Socket-Programmierung_2/Datei/test.txt") or die $!;
binmode $FH;
$daten = <$FH>;
#packen
$zip_daten = '';
use IO::Compress::Zip qw(zip $ZipError);
$status = zip \$daten => \$zip_daten or die "zip schlug fehl!: $ZipError\n";
#Länge des Strings ermitteln
$laenge_Client = length($zip_daten);
#Sende Länge der Daten zu Server
$socket->send($laenge_Client) or warn $!;
#Ermittle Anzahl der Datenpakete
$Anzahl_Pakete = ($laenge_Client)/1024;
#Auf nächste Ganzzahl aufrunden
$Anzahl_Pakete = ceil($Anzahl_Pakete);
#Prüfsumme ermitteln
#$checksum_Client = unpack ("%16C*", $daten);
use Digest::MD5 qw(md5_hex);
$checksum_Client = md5_hex($zip_daten);
my $abc = length($Bestaetigung_checksum);
print "Länge Prüfsumme: $abc";
print "1\n";
while($Bestaetigung_checksum == 0)
{
print "21\n";
#Bestaetigung erhalten ob Prüfsumme erfolgreich gesendet wurde
do
{
if($client_socket->can_read($maxTimeout))
{
$socket->recv($Bestaetigung_checksum,16) or warn $!;
}
}
while(length($Bestaetigung_checksum) == 0);
print "Bestaetigung_checksum: $Bestaetigung_checksum\n";
if($Bestaetigung_checksum == 0)
{
print "22\n";
#Prüfsumme an Server senden
$socket->send($checksum_Client) or warn $!;
print("Prüfsumme: $checksum_Client\n");
}
}
print "3\n";
#Startzeit setzen
($start_sec, $start_usec) = gettimeofday();
#Festlegung der Punkte an denen der String getrennt wird
$Trenn_Ende = 1024;
$Trenn_Anfang = 0;
while($Bestaetigung_checksum_daten == 0)
{
#Bestaetigung erhalten ob Prüfsumme übereinstimmt
do{
print "30\n";
if($client_socket->can_read($maxTimeout))
{
$socket->recv($Bestaetigung_checksum_daten,16) or warn $!;
}
}while(length($Bestaetigung_checksum_daten) == 0);
print "Bestaetigung_checksum_daten: $Bestaetigung_checksum_daten\n";
print "31\n";
if($Bestaetigung_checksum_daten == 0)
{
for($i = 0; $i<$Anzahl_Pakete; $i++)
{
print "32\n";
while($Bestaetigung_laenge_daten == 0)
{
#Bestaetigung erhalten ob Länge übereinstimmt
do{
if($client_socket->can_read($maxTimeout))
{
$socket->recv($Bestaetigung_laenge_daten,16) or warn $!;
}
}while(length($Bestaetigung_laenge_daten) == 0);
print "Bestaetigung_laenge_daten: $Bestaetigung_laenge_daten\n";
print "33\n";
if($Bestaetigung_laenge_daten == 0)
{
#String trennen und Datenpakete bilden
$data = substr($zip_daten,$Trenn_Anfang,$Trenn_Ende);
$Trenn_Anfang = $Trenn_Ende;
$Trenn_Ende = $Trenn_Ende + 1024;
print "34\n";
#sende Datenpakete zu Server
$socket->send($data) or warn $!;
}
print "35\n";
}
print "36\n";
$data = ();
}
print "37\n";
}
print "38\n";
}
#Endzeit setzen
($end_sec, $end_usec) = gettimeofday();
print "4\n";
#Sendezeit ermitteln
$timeDelta = ($end_usec - $start_usec)/1000 + ($end_sec - $start_sec)*1000;
print "Die Sendezeit betraegt: $timeDelta ms\n";
#lösche Inhalt
$daten = ();
$zip_daten = ();
$data = ();
#Abfrage ob Programm beenden
print "Wenn Programm durchgeführt werden soll dann bitte j eingeben, ansonsten beliebiges anderes Zeichen eingeben\n";
$end = <STDIN>;
chop($end);
if($end eq 'j')
{
#Programm beenden
close($socket);
exit();
}
}
#Schließe Socket
$socket -> close();