Socket, buffering?

Socket, buffering?

am 03.06.2006 19:01:05 von Torsten Mohr

Hallo,

ich habe nach einem einfachen Beispiel einen Single-Threaded Server
geschrieben, mit dem ich mich per "telnet localhost 2345" verbinde.

Beispielhaft bekommt der Client alle seine Eingaben per "print"
zurück (Ausnahme: 'quit' beendet die Session). Die Eingaben
gehen auch in ein Logfile.

Im Logfile kommen die Eingaben sofort an, das Verhalten ist wie
erwartet.

Der Client (telnet) bekommt die Ausgaben nur angezeigt, nachdem
er dem Server den Befehl 'quit' gesendet hat.

Anscheinend werde die Ausgaben des Servers irgendwo gebuffert.


Wie kann ich das Abschalten?


Grüße,
Torsten.


Hier einige wichtige Teile des Codes:

sub server {
my $stop = 0;
my $session = 1;

$protocol = getprotobyname('tcp');
socket(Server, PF_INET, SOCK_STREAM, $protocol) or die "socket: $!\n";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack('l', 1)) or die
"setsockopt: $!\n";
$local_sockaddr = sockaddr_in($local_port, INADDR_ANY);
bind(Server, $local_sockaddr) or die "bind: $!\n";
listen(Server, SOMAXCONN) or die "listen: $!\n";

logf("listening on port $local_port");
while(!$stop) {
$remote_sockaddr = accept(Client, Server);
($remote_port, $remote_ipaddr) = sockaddr_in($remote_sockaddr);
$remote_name = gethostbyaddr($remote_ipaddr, AF_INET);
logf("connection from $remote_name [ ". inet_ntoa($remote_ipaddr) . "]
at port $remote_port");
select Client;
$| = 0;
select;
print Client "Hi $remote_name, it's now " . scalar localtime() . "\n";

$session = 1;
while($session) {

my $ln = ;
$ln =~ s/\r?\n$//;

logf("You said '$ln'");
print Client "You said '$ln'\n";
if($ln eq 'quit') {
logf("got quit");
$session = 0;
}
}

logf("session end");

close Client;
}
}

Re: Socket, buffering?

am 03.06.2006 22:41:21 von df4or

Torsten Mohr wrote:
[...]
> ich habe nach einem einfachen Beispiel einen Single-Threaded Server
> geschrieben, mit dem ich mich per "telnet localhost 2345" verbinde.
[...]
> Der Client (telnet) bekommt die Ausgaben nur angezeigt, nachdem
> er dem Server den Befehl 'quit' gesendet hat.
>
> Anscheinend werde die Ausgaben des Servers irgendwo gebuffert.

Verwendest Du eine ältere Version von IO::Socket? Ab 1.18 ist autoflush()
defaultmässig enabled, d.h. da sollte nix gebuffert werden.

Enable mit:
SOCKETHANDLE->autoflush(1);

Gruß,
Ekki

Re: Socket, buffering?

am 05.06.2006 05:10:52 von Torsten Mohr

Danke, der Teil läuft jetzt, ich hatte $/ falsch gesetzt.

Grüße,
Torsten.