Matti Maekitalo: Socketprogrammierung

Beitrag lesen

use Mosche;

Wenn ich mit Telnet den Server blockiere kann ich nicht mehr mit einem anderen Programm drauf zugreifen. Es müßte doch aber möglich sein, das der einer eingehenden Verbindung eine Subroutine zuweist, und dann weiter auf eingehende Verbindungen wartet, während der andere Client abgefertigt wird.

Wie an meiner Antwort an CK zu sehen ist, empfehle ich das Modul IO::Select. Damit geht das dann _wirklich_ einfach.

if($comm =~ m/STAT/) { print $client "+OK 2 500\r\n"; }
    elsif($comm =~ m/LIST/) { print $client "+OK\r\n1 50\r\n2 450\r\n.\r\n"; }
    elsif($comm =~ m/RETR/) { print $client "+OK\r\nFrom: me@home\r\nTo: you@home\r\nSubject: hi\r\n\r\nhihihi.\n\n\nhihihi\r\n.\r\n"; }
    elsif($comm =~ m/DELE/) { print $client "+OK\r\n"; }
    elsif($comm =~ m/QUIT/) { print $client "+OK\r\n"; }
   }
}

Für diesen Codeschnippsel ampfehle ich dir etwas anders zu machen.
Und zwar nimmst du für jedes POP-Kommando eine anonyme Subroutine und packst diese in einen Hash, mit dem Kommando als Schlüssel.

my %POP;

$POP{'STAT'} = sub {
 #...
}

$POP{'RETR'} = sub {
 #...
}

#...

dann wird nämlich deine if..elsif Abfrage wesentlich kürzer:

if  ($POP{$comm}) {
  $POP{$comm}->($client); ## ggf. noch weiter Argumente
 } else {
  # falsches Kommando oder nich nicht implementiert
 }

Die POP Kommandos kannst du dann auch ganz einfach in ein Modul packen. Das ist wesentlich einfacher zu erweitern.

Da ich momentan gerade an einem kleinen NNTP-Server arbeite, kann ich dir meinen Code mit dem implementierten IO::Select und dem anonymen Subroutinen für die Pop- (bei mir NNTP-) -Kommandos geben. Schreib mir diesbezüglich ne E-mail.

use Tschoe qw(Matti);