#!/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 = ; chop($end); if($end eq 'j') { #Programm beenden close($socket); exit(); } } #Schließe Socket $socket -> close();