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