Joa da bin ich mal wieder,
und wie nicht anders zu erwarten hab ich (mal wieder) ein Problem mit Perl...
Um genauer zu sein mit IO::Socket und einem Server mit dazugehörigen Clienten.
Eigentlich soll der Server einfach nur auf einem Port lauschen und Befehle die ihm der Client schickt ausführen und die Ausgaben zurück an den Client senden.
Die Ganze Prozedur soll durch ein "[/HELLO SERVER/]" das vom Clienten an den Server geschickt wird eingeleitet werden.
Der Server soll daraufhin ein "[/HELLO CLIENT/]" zurückschicken und daraufhin die Befehle die danach geschickt werden "sammeln".
Sobald ein "[/OK SERVER/]" vom Client kommt soll der Server die empfangenen Befehle in der Konsole ausgeben und ein "[/OK CLIENT/]" zurückschicken.
Daraufhin soll der Server dem Clienten die Ausgaben der ausgeführten Befehle schicken und mit einem "[/BYE CLIENT/]" die Verbindung beenden.
Daraufhin soll er wieder am Port auf ein "[/HELLO SERVER/]" warten...
Der Client sammelt solange die Ausgaben bis er das "[/BYE CLIENT/]" empfängt und beendet schließlich die Verbindung auch auf Clientseite.
Jetzt soll er die Ausgaben nur noch in der Konsole ausgeben und Fertig...
Dazu hab ich folgende Scripte erstellt:
(Server und Client bekommen wenn alles funktioniert noch eine Timeout-Funktion,
damit Server/Client bei abgebrochener Verbindung nicht in einer Endlosschleife ended...)
Allerdings funktioniert das (wer hätte es gedacht?) net wirklich x(
Das einzige was ausgegeben wird sind die Start-Nachrichten :?
Zu Bemerken ist, dass ich IO:Socket zum ersten mal benutze, und generell noch nie viel mit Netzwerken gearbeitet hab,
außer SSH und Telnet bei denen das ganze aber (dank fertiger Pakete) irgendiwe wesentlich einfacher war ^^
Wär nett wenn mit jemand bei meinem Problem helfen,
und mir sagen könnte wo mein Fehelr liegt
MFG - Keks
und wie nicht anders zu erwarten hab ich (mal wieder) ein Problem mit Perl...
Um genauer zu sein mit IO::Socket und einem Server mit dazugehörigen Clienten.
Eigentlich soll der Server einfach nur auf einem Port lauschen und Befehle die ihm der Client schickt ausführen und die Ausgaben zurück an den Client senden.
Die Ganze Prozedur soll durch ein "[/HELLO SERVER/]" das vom Clienten an den Server geschickt wird eingeleitet werden.
Der Server soll daraufhin ein "[/HELLO CLIENT/]" zurückschicken und daraufhin die Befehle die danach geschickt werden "sammeln".
Sobald ein "[/OK SERVER/]" vom Client kommt soll der Server die empfangenen Befehle in der Konsole ausgeben und ein "[/OK CLIENT/]" zurückschicken.
Daraufhin soll der Server dem Clienten die Ausgaben der ausgeführten Befehle schicken und mit einem "[/BYE CLIENT/]" die Verbindung beenden.
Daraufhin soll er wieder am Port auf ein "[/HELLO SERVER/]" warten...
Der Client sammelt solange die Ausgaben bis er das "[/BYE CLIENT/]" empfängt und beendet schließlich die Verbindung auch auf Clientseite.
Jetzt soll er die Ausgaben nur noch in der Konsole ausgeben und Fertig...
Dazu hab ich folgende Scripte erstellt:
Code:
#!/usr/bin/perl
use English;
use strict;
use IO::Socket;
# SOCKET ÖFFNEN
my $server_socket = new IO::Socket::INET (
LocalPort => 6000,
Listen => SOMAXCONN,
Proto => 'tcp',
Reuse => 1
) || die "$!\n";
print "Server gestartet...\n";
my $response = '';
# AUF EINGEHENDE VERBINDUNG WARTEN
while (my $client_socket = $server_socket -> accept() ) {
# AUF EIN [/HELLO SERVER/] VOM CLIENT WARTEN
if( <$client_socket> eq "[/HELLO SERVER/]" ){
# DEM CLIENT EIN [/HELLO CLIENT/] ZURÜCKSCHICKEN
print $client_socket "[/HELLO CLIENT/]";
# BEFEHLE EMPFANGEN UND AUF [/OK SERVER/] WARTEN
while( 1 ){
my $sr = <$client_socket>;
if( $sr eq "[/OK SERVER/]" ){
last;
}else{
$response .= $sr;
}
}
# EMPFANGENE BEFEHLE IN KONSOLE AUSGEBEN
print $response;
# DEM CLIENT EIN [/OK CLIENT/] SCHICKEN
print $client_socket "[/OK CLIENT/]";
# DEM CLIENT EIN DIE AUSGABEN DES BEFEHLS SCHICKEN SCHICKEN
print $client_socket "result 1\n";
print $client_socket "result 2\n";
print $client_socket "result 3\n";
# DEM CLIENT EIN [/BYE CLIENT/] SCHICKEN
print $client_socket "[/BYE CLIENT/]";
$client_socket -> close();
}
}
Code:
#!/usr/bin/perl
use English;
use strict;
use IO::Socket;
# SOCKET ÖFFNEN
my $socket = new IO::Socket::INET (
PeerAddr => "localhost",
PeerPort => 6000,
Proto => 'tcp'
) || die "$!\n";
print "Client gestartet...\n";
my $response = '';
# DEM SERVER EIN [/HELLO SERVER/] SCHICKEN
print $socket "[/HELLO SERVER/]";
# AUF EIN [/HELLO CLIENT/] VOM SERVER WARTEN
while( 1 ){
if( <$socket> eq "[/HELLO CLIENT/]" ){
last;
}
}
# DEM SERVER DIE BEFEHLE SCHICKEN
print $socket "mach irgendwas";
print $socket "mach noch mehr";
# DEM SERVER EIN [/OK SERVER/] SCHICKEN
print $socket "[/OK SERVER/]";
# AUF EIN [/OK CLIENT/] VOM SERVER WARTEN
while( 1 ){
if( <$socket> eq "[/OK CLIENT/]" ){
last;
}
}
# AUSGABEN DER BEFEHLE EMPFANGEN UND AUF EIN [/BYE CLIENT/] VOM SERVER WARTEN
while( 1 ){
my $sr = <$socket>;
if( $sr eq "[/BYE CLIENT/]" ){
$socket -> close();
last;
}else{
$response .= $sr;
}
}
# AUSGABEN DER BEFEHLE IN DER KONSOLE AUSGEBEN
print $response;
damit Server/Client bei abgebrochener Verbindung nicht in einer Endlosschleife ended...)
Allerdings funktioniert das (wer hätte es gedacht?) net wirklich x(
Das einzige was ausgegeben wird sind die Start-Nachrichten :?
Zu Bemerken ist, dass ich IO:Socket zum ersten mal benutze, und generell noch nie viel mit Netzwerken gearbeitet hab,
außer SSH und Telnet bei denen das ganze aber (dank fertiger Pakete) irgendiwe wesentlich einfacher war ^^
Wär nett wenn mit jemand bei meinem Problem helfen,
und mir sagen könnte wo mein Fehelr liegt
MFG - Keks