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