Thread substr(): Alternative gesucht (15 answers)
Opened by bloonix at 2007-07-02 15:44

bloonix
 2007-07-02 19:35
#78141 #78141
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Kurze Erläuterung warum syswrite() + 16k + so weiter...

Aus irgendeinem Grund werden immer nur 16384 Bytes (16k) über das
Socket geschrieben und gelesen. Dieses Phenomän - wenn man es so
ausdrücken darf - habe ich allerdings nur bei IO::Socket::SSL festgestellt,
nicht aber bei IO::Socket::INET. Deshalb wollte ich auch bzw muss ich die
Daten in Chunks aufteilen. Mir war aber nicht ganz klar, wie ich das so
realisieren kann.

Nun habe ich es wie folgt hinbekommen (ohne unpack()):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    my $buffer = 'x' x 100000000;
   my $length = length($buffer);
   my $offset = 0;
   my $i      = 0;

   my $client = $ipc->accept();
   warn "connect from: ", $client->peerhost, "\n";
   warn "print $length bytes to client\n";

   while ($length) {
     # syswrite() schreibt immer nur 16k bei IO::Socket::SSL
      my $written = syswrite($client, $buffer, $length, $offset);
      die "System write error: $!\n" unless defined $written;
      $length -= $written;
      $offset += $written;
      $i++;
   }  

   warn "Iterations: $i\n";


Iterations: 6104

Die unpack() Beispiele könnten aber von größerem Interesse sein, da ich
die Chunks direkt erhalte und nicht den gesamten $buffer jedesmal an
syswrite() übergeben muss.\n\n

<!--EDIT|opi|1183390659-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.

View full thread substr(): Alternative gesucht