IO::Socket, telnet?
am 05.06.2006 05:19:21 von Torsten MohrHallo,
mit dem unten angehängten Code kann ich eine Verbindung zu
einem lokalen Server aufbauen, das klappt soweit auch alles
wie ich es erwarte, bis auf:
Die erste Meldung des Servers wird nicht angezeigt/empfangen.
Wenn ich per "telnet localhost 25" eine Verbindung aufbaue
bekomme ich eine Meldung vom dort hörenden Postfix.
Mit meinem Code habe ich zwar auch eine Verbindung, aber
die erste Meldung ist nicht zu sehen, wobei ich mir das
durch den Programmablauf nicht erklären kann.
Im Programm baue ich eine Verbindung auf und teste in
einer Schleife ob Daten entweder an STDIN oder $sock
anliegen. Daten von $sock werden ausgegeben, Daten von
STDIN werden an $sock ausgegeben.
Das ist relativ einfach, deshalb verstehe ich auch nicht,
weshalb die ersten Daten von $sock nicht ausgegeben werden.
Hat da jemand einen Tipp?
GrüÃe,
Torsten.
#! /usr/bin/perl -w
use IO::Socket::INET;
use IO::Select;
my $sock = new IO::Socket::INET(
PeerHost => 'localhost',
PeerPort => 25,
Proto => 'tcp',
Blocking => 0
);
my $sel = new IO::Select;
$sel->add($sock);
$sel->add(\*STDIN);
my $stop = 0;
my @ready;
while(!$stop) {
@ready = $sel->can_read();
foreach my $io (@ready) {
if($io->eof) {
$stop = 1;
}
if($io == $sock) {
$! = undef;
my $n = sysread $io, $buffer, 4096;
if(defined($n) and $n == 0) {
print "EOF!\n";
$stop = 1;
}
my @L = split /\n/, $buffer;
foreach $line (@L) {
$line =~ s/\r?\n$//;
print STDOUT " sock: '$line'\n";
}
}
else {
$line = <$io>;
$line =~ s/\r?\n$//;
print $sock "$line\n";
}
}
}