2

これは、すでに回答されている私の以前の質問に関連しています。

C: select 呼び出しを使用して、読み取り中にデータを追跡するにはどうすればよいですか?

私のプロトコルは、他のデータを送信する前に、最初に送信するデータの量を実際に送信します。しかし、昨日、ブラウザを使用してこのコードをテストしたとき、次の 1 つの質問がありました。

多くの人が、メッセージの長さをチェックするが、ブラウザーのシナリオを採用することを提案しました。ブラウザの HTTP リクエストには、最初にサーバーに送信されるときのサイズがありません。ここで、256 バイトのバッファーを使用したと仮定すると、多重化アクションごとに部分ヘッダーを受信し続ける場合、このクライアントのデータ構造をどのように管理すればよいでしょうか? より多くのデータを取得し続けるため、realloc を使用し続け、終了シーケンス ('\r\n') に遭遇すると、すべてのデータが受信されたと想定しますか?

つまり、次のようなものがあります。

typedef struct {
   int fd;
   char *data;
} CLIENT;

そして、データに再割り当てを使い続けますか? 最大プロトコル ヘッダーのバッファ サイズを割り当てるように言われましたが、それが唯一の方法ですか?

4

1 に答える 1

1

バッファのサイズを再割り当てしても問題ありません。少なくとも 256 ~ 1024 または 4096 よりも少し大きいバッファーを選択します。HTTP のようなプロトコルの最大バッファー サイズを割り当てることは、実際には実現可能ではありません。行を読み取ることができるバッファの上に抽象化を構築することもできます-fgetsがFILE *で行うのと同じように

チャンクを読み取ると、HTTP ヘッダーの最後の部分と HTTP 本文の一部が読み取られる可能性があることに注意してください。また、Content-Length: ヘッダーを探して解析する必要があるため、本文の長さがわかります。

于 2010-01-29T22:48:04.337 に答える