Socket, buffering?
am 03.06.2006 19:01:05 von Torsten MohrHallo,
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;
}
}