TCP ソケットでのすべての読み取りは、指定したバッファーのバッファー サイズに応じて、1 バイトから送信された合計量の間のいずれかを返します。考えられるのは、Web サーバーがデータを 2 つの別々の書き込みとして送信し、これがたまたまサーバーの TCP スタックによって 2 つの別々のデータ ブロックとして送信されていることです。データが到着したため、読み取りが完了しています。プログラマーが期待するすべてのデータが到着するまで、またはバッファーがいっぱいになるまで、読み取りは待機しません。
ネットワークの問題は、ルーターが物事を断片化する可能性があり、失われたデータが再送信中に物事を遅らせる可能性があるため、問題をさらに混乱させる可能性があります.
TCP を使用するときは常に、読み取りが一度に 1 バイトだけを返し、それに応じてコーディングすることを想定する必要があります。そうすれば、物事は常に機能します。
別の読み取りを発行するだけで、残りのデータが到着したときに取得できます。
ここで見つけることができる私の無料の IOCP サーバー フレームワーク (クライアントも同様) を見てみたいかもしれません。すでに機能しているように聞こえますが、別の方法を検討できると役立つ場合があります。
処理前にデータを蓄積する必要がある場合、次のアプローチを取る傾向があります。read を発行して完了するのを待ち、持っているものを見て、必要なものがすべて揃っておらず、バッファーにまだスペースがある場合は、WSABUF
使用している を調整して、の最後を指すようにします。同じバッファーに到着したばかりの現在のデータと別の読み取りを発行します。その後、処理するのに十分なデータが得られるか、さらにデータを取得するために別のバッファーを追加する必要があるまで、同じバッファーに蓄積します。