Socket.pm für Windows 2000
Thomas Berger
ThB.com at t-online.de
Fr Jan 19 14:08:10 CET 2001
Liebe Frau Koczian,
> At 12:34 19.01.01 +0100, you wrote:
> >> select(S); $| = 1; select(stdout);
> >
> >Autoflush? Naja.
> >
> Steht genau so in tcp-ip.pl wie vom Server geholt. Ungut?
Jain: In diesem Modus werden geschriebene Daten auf
die Reise geschickt, wann immer eine Zeile voll ist
(d.h. sobald ein Zeilenumbruch in einem Zwischenbuffer
steht, wird ein neues TCP-Paket gebildet und abgeschickt).
Tendenziell erzeugt diese Einstellung natuerlich
mehr Verkehr (durch den Sender).
Der Vorteil ist aber, dass man sich mit den Tuecken
gebufferter Uebertragung ($|=0; # d.h. ein Paket
wird erst dann gesendet, wenn Perl es bis zur
Maximalkapazitaet 8192? mit Daten fuellen kann)
nicht herumschlagen braucht: Sie haben
AVANTI:EOJ\n
geschrieben und warten auf Rueckmeldung, der
Text haengt aber noch im Buffer und ist noch
lange nicht beim Empfaenger, der also auf
das AVANTI:EOJ wartet, alles steht...
[In diesem Fall muss man dann seinen Sende-
Buffer explizit flushen:
sub flush_S {
my $savefh = select(S); # aktuellen Standard-FH retten
$| = 1; # Autoflush setzen
print S ""; # ab gehts!
$| = 0; # Autoflush zuruecknehmen
select($savefh); # restaurieren
}
In dem Beispiel-Skript und bei acwww25 ist es
im uebrigen ziemlich egal: Immerhin wird der
ganze Job in einer Variablen zusammengebaut
und dann komplett weggeschrieben. Das hat im
uebrigen historische Gruende, die auch wieder
mit dem Autoflush zusammenhingen: Die ersten
Versionen von avanti-w rechneten los, sobald
das erste TCP-Paket empfangen war...
viele Gruesse
Thomas Berger
Mehr Informationen über die Mailingliste Allegro