mal wieder ich und mein perl... (IO::socket)

Joa da bin ich mal wieder,
und wie nicht anders zu erwarten hab ich (mal wieder) ein Problem mit Perl... :D


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;
(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
 
Mir ist neu, dass <$client_socket> funktioniert, ich kenne bei IO::Socket nur $clientsocket->recv;
oder auch "->read" oder "->send". Das mit den Handles geht zwar, aber irgendwie anders und nicht bei IO::Socket.
guck dir mittels perldoc doch die Hilfe an. "perldoc IO::Socket" oder hast du kein Linux/Unix?
 
zZ Bin ich unter Windows unterwegs (Active State Perl)
Hab' jedoch noch auf mehrere Linux-Distributionen zugriff :)

Die Man-Pages hab ich mir angesehn, jedoch bin ich daraus net wirklich schlau geworden...
Im Netz hab ich auch gesucht doch immer nur Beispiele gefunden bei denen immer nur ein Befehl vom Server zum Client, oder umgekehrt, geschickt wird und die Verbindung daraufhin beendet wird...


Mit den Handles konnte ich wenigstens noch eine Antwort schicken,
sprich Client verbindet -> server sagt hallo und beendet die Verbindung.

Mit "recv", "read" und "send" passiert nu garnix mehr :(

Könntest du mir mal ein kleines Beispiel schreiben?
zB Client schickt was an den Server, der daraufhin Antwortet, woraufhin der Client wiederum die Antwort empfängt und ausgibt... oÄ *ganz lieb guck* ^^

[ EDIT: ]

Habs :D

Code:
#!/usr/bin/perl -w

use English;
use strict;
use IO::Socket;

# SOCKET ÖFFNEN
my $socket = new IO::Socket::INET (
    LocalPort => 6000,
    Listen    => 1,
    Proto     => 'tcp',
    Reuse     => 1
) || die "$!\n";

print "Server gestartet...\n";

while( 1 ){

    my $client = $socket -> accept();

    $client -> recv( my $response , 1024 );

    chomp($response);
    print "$response\n";

    $client -> send( "[/HELLO/]" );
    
}
Code:
#!/usr/bin/perl -w

use English;
use strict;
use IO::Socket;

# SOCKET ÖFFNEN
my $socket = new IO::Socket::INET (
        PeerAddr => "localhost",
        PeerPort => 6000,
        Proto    => 'tcp',
        Timeout  => 10,
) || die "+++ERROR [SOCKET] : could not establish connection: $!\n";

print "Client gestartet...\n";

$socket -> send( "[/HELLO/]" );
$socket -> recv( my $response , 1024 );

chomp($response);
print "$response\n";

Dankööö :)

MFG - Keks
 
gibt nix zu danken, du hast es ja selbst geschafft :)
die Hilfeseiten gibt es im übrigen natürlich auch auf CPAN.org
 
Zurück
Oben