Hallo liebe Kameltreiber,
auch ich möchte mich programmiersprachentechnisch weiterbilden, und meine Wahl ist auf Perl gefallen. Nach einigen kleinen Übungsscripts habe ich mal einen Echo-Client geschrieben, der von STDIN liest, das Gelesene per UDP an einen Echo-Server schickt und gleichzeitig mittels IO::Select auf die Antwort wartet (nachfolgend der Quelltext). Das Script funktioniert auch, aber mir stellen sich zwei Fragen:
-
Kann ich STDIN so wie Sockets irgendwie objektorientiert kapseln? Das nackte *STDIN zu übergeben sieht neben dem $recvsock doch irgendwie hässlich aus.
-
Warum muss ich, wenn auf STDIN Daten vorliegen, diese zuerst zwischenspeichern? Eigentlich sollte ja auch sowas
$sendsock->send()
funktionieren, aber bei mir klappts merkwürdigerweise nur über den Umweg.
Grübelnde Grüße
Chondron
#!/usr/bin/perl
use strict;
use IO::Select;
use IO::Socket;
my($sendsock, $recvsock, $nachricht, $MAXLEN,$PORTNO);
$MAXLEN=1024;
$PORTNO=4711;
$recvsock = IO::Socket::INET-\>new(Proto =\>'udp', LocalPort =\> '4712') or die "socket: $@";
$sendsock = IO::Socket::INET-\>new(Proto =\>'udp', PeerAddr =\> '127.0.0.1:4711') or die "socket: $@";
my $s = IO::Select-\>new();
$s-\>add(\*STDIN);
$s-\>add($recvsock);
my @readables;
while (@readables = $s-\>can\_read)
{
foreach my $hready (@readables)
{
if ($hready == $recvsock)
{
my $msg;
defined ($recvsock-\>recv($msg, 1024)) or die "recv: $!";
print $msg;
}
if ($hready == \*STDIN)
{
my $temp = ;
chomp $temp;
defined ($sendsock-\>send($temp)) or die "send: $!";
}
}
}