Fragen? Antworten! Siehe auch: Alternativlos
Na egal, habe ich halt ein anderes zlib-Interface ("inflate") benutzt, um damit die hereinkommenden Daten, die ich per recv lese, zu unzippen, und was soll ich euch sagen — Z_DATA_ERROR. Weil zlib ein anderes Format als gzip benutzt, und man muss inflate sagen, daß man einen gzip-Header erwartet, indem man inflateInit2 benutzt statt inflateInit, und dann bei dem Parameter, der die Anzahl der Bits im Compression Window, 32 dazu addiert. Das teilt dann inflate mit, daß auch ein gzip-Header OK ist.
Aber hey, ich habe da jetzt schon so viel Zeit rein versenkt, diesen Benchmark unter Windows zum Laufen zu bringen, ich lasse mich jetzt nicht von zlib abhalten!! Also habe ich das gemacht, und immerhin den 1. Teil durchgeführt, das Auspacken des Tarballs. Vorher den Durchsatz mal verdreifacht, indem ich den Antivirus, Windows Defender und den Search Service abgeschossen habe; soll die Nachwelt entscheiden, ob ich das tun mußte, weil das sonst unfair gewesen wäre, oder ob ich das hätte drinlassen sollen. Man könnte ja auch argumentieren, daß Microsoft einem diesen Scheiß per Default ausliefert, also ist das nicht meine Schuld, wenn ich das nicht ausmache. Ich habe ja auch unter Unix den sshd nicht abgeschossen. Anyway, ich habe also endlich die Dateien auf die Platte gehauen, und meinen gehackten Webserver gestartet, und … ich kriege bizarrste Fehlermeldungen. Ich benutze da u.a. overlapped I/O, d.h. ich haue Requests raus, und queue die mit einem Zeiger auf eine State-Struktur an einem Completion Port, so funktioniert deren API. Dann kriege ich mitgeteilt, da ist ein Vorgang fertig, und hier ist der State dazu. Und an der Stelle wird einem dann auch gesagt, wie viele Bytes man denn nun tatsächlich gelesen hat. Und was soll ich euch sagen, ich queue da Reads für 8k (mehr Header erwarte ich nicht, die tatsächlichen Header sind eher so 150 Bytes), und der Completion Port sagt mir dann, "ich habe die 83k gelesen, die du haben wolltest". WTF?! Nicht nur das, ich kriege auch den Effekt, daß ein Read, den ich rausschicke, nicht mit "OK, ich melde mich dann später" antwortet, sondern sofort fertig wird. Laut API-Beschreibung kann das nicht passieren. Tja, und dann segfaultet der Serverprozeß plötzlich. Reproduzierbar. Oh, nicht in meinem Code, in NTDLL. Grunz!! Ich vermute ja, daß da deren State Machine durcheinander kommt und mir einen Block zweimal zurück gibt, und daher ein Double Free passiert oder so. Aber im Moment ist das völlig unklar alles.