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