IO::Socket, telnet?

IO::Socket, telnet?

am 05.06.2006 05:19:21 von Torsten Mohr

Hallo,

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";
}
}
}

Re: IO::Socket, telnet?

am 10.06.2006 18:18:59 von Torsten Mohr

Hi,

leider scheint hier niemand einen Tip zu haben, schade.
Mit dem Code den ich vorher verwendet habe, der nicht
auf IO::Socket basierte sondern Perls eigene Aufrufe
verwendete war das kein Problem.

Auch wenn ihr keine Tips habt, könnt ihr das Problem
mit dem Code unten denn nachvollziehen?


Grüße,
Torsten.


> 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";
> }
> }
> }