2

私は自分の HTTP fetcher ソケットをコーディングしています。私は MVC++ と winsocket2.h で C++ を使用しています。ソケットをプログラムして、必要な Web サイトのサーバーに接続し、HTTP GET 要求を送信することができました。

問題は、キープアライブ接続で HTTP GET 要求を送信した後、recv 関数を呼び出すことです。Web サイトを取得した後を除いて、問題なく動作し、サーバーまたは接続からのタイムアウトのヒントを待ち続けます。閉じる!!

これは、サーバーのキープアライブ タイムアウトに応じて数秒かかるため、キープアライブ HTTP 設定の恩恵を受けられません。

Web サイトを取得した後に recv 関数を停止するように指示し、コマンドを返して、別のハンドシェイク体制を回避しながら別の HTTP 要求を送信できるようにするにはどうすればよいでしょうか。

ノンブロッキング ソケットを使用すると、より高速に動作しますが、停止するタイミングがわかりません。str.rfind("",-1,7) を設定して、データの取得を停止します。ただし、あまり効率的ではありません。

誰かがそれを行う方法を知っていますか、または接続が維持されているときにHTTPサーバーによって送信される最後の文字は何ですか?それで、停止の決定として使用できます.

ベスト、
萌え

4

2 に答える 2

3

ヘッダーを確認し、Content-Length: xxxxxヘッダーの後の xxxxx バイトのみを読み取り、空白行で終了します (ストリーム内の CR-LF-CR-LF)。

アップデート

データがチャンクされている場合:

Chunked Transfer-Encoding (リファレンス)

...

チャンクされたメッセージ本文には、一連のチャンクが含まれ、その後に "0" (ゼロ) の行が続き、その後にオプションのフッター (ヘッダーと同様)、および空白行が続きます。各チャンクは次の 2 つの部分で構成されます。

  • チャンク データのサイズ (16 進数) を示す行で、その後にセミコロンと無視できる追加のパラメーター (現在は標準ではありません) が続き、CRLF で終わります。
  • データ自体、その後に CRLF が続きます。

また、Chunked Transfer-Encoding のhttp://www.w3.orgの説明は、セクション 3.6.1 @ http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.htmlにあります。

于 2011-02-08T02:51:50.037 に答える
0

ソケットに非ブロッキング I/O フラグを設定すると、recv受信済みのデータだけですぐに戻ります。selectこれを、WSAEventSelect、 、または完了ポートと組み合わせて、 WSAAsyncSelect(ビジー待機の代わりに) データが到着したときに通知されます。

于 2011-02-08T02:57:42.990 に答える