0

私は非常に単純な IOCP HTTP サーバーを作成しました。これは GET 動詞では機能しますが、POST では機能しません。

ソケットと、accept() が接続を待機するリッスン スレッドを作成します。クライアントが接続したら、ioctlsocket() を呼び出してソケットのブロックを解除し、ソケットを IOCP に関連付け、最後に WSARecv() を呼び出してデータを読み取ります。

一部のデータが実際に読み取られ、それが発生すると、IOCP は GetQueuedCompletionStatus() を介してワーカー スレッドを起動し、要求データを回復します。

任意のブラウザーから POST するときにのみ、要求ヘッダーを取得します。理由について何か提案はありますか?

4

1 に答える 1

2

TCP ソケットでのすべての読み取りは、指定したバッファーのバッファー サイズに応じて、1 バイトから送信された合計量の間のいずれかを返します。考えられるのは、Web サーバーがデータを 2 つの別々の書き込みとして送信し、これがたまたまサーバーの TCP スタックによって 2 つの別々のデータ ブロックとして送信されていることです。データが到着したため、読み取りが完了しています。プログラマーが期待するすべてのデータが到着するまで、またはバッファーがいっぱいになるまで、読み取りは待機しません。

ネットワークの問題は、ルーターが物事を断片化する可能性があり、失われたデータが再送信中に物事を遅らせる可能性があるため、問題をさらに混乱させる可能性があります.

TCP を使用するときは常に、読み取りが一度に 1 バイトだけを返し、それに応じてコーディングすることを想定する必要があります。そうすれば、物事は常に機能します。

別の読み取りを発行するだけで、残りのデータが到着したときに取得できます。

ここで見つけることができる私の無料の IOCP サーバー フレームワーク (クライアントも同様) を見てみたいかもしれません。すでに機能しているように聞こえますが、別の方法を検討できると役立つ場合があります。

処理前にデータを蓄積する必要がある場合、次のアプローチを取る傾向があります。read を発行して完了するのを待ち、持っているものを見て、必要なものがすべて揃っておらず、バッファーにまだスペースがある場合は、WSABUF使用している を調整して、の最後を指すようにします。同じバッファーに到着したばかりの現在のデータと別の読み取りを発行します。その後、処理するのに十分なデータが得られるか、さらにデータを取得するために別のバッファーを追加する必要があるまで、同じバッファーに蓄積します。

于 2010-04-23T15:54:34.843 に答える