2012-02-23 15 views
1

すべてのデータがソケットから受信されたかどうかをどのように判断できるのでしょうか。これは単純なWebプロキシですが、今はリクエスト部分を処理していますので、送信されるものは '\ r \ n \ r \ n'で終了する必要があります。私はここでいくつかの記事を読んだことがありますが、私は0が読み込み関数から返されているかどうかチェックする必要があります。しかし、クライアントが接続を閉じたときにのみ0を返す他のものは返されますか?さもなければ、私はバッファの最後の文字をチェックし、それらが上記と一致するかどうか確認できますか?ソケットから読み取るC HTTP

もっと多くのデータがある場合は、読み出したデータをバッファにロードしてそのデータを保存するだけです。

ありがとうございました

答えて

2

HTTPは、いくつかのRFCを取って些細なプロトコルで、されていないファイルの終わりを示しますあなたは、ブロッキングソケット上にある場合

  • を読むために再試行する前に待機しなければならないことを意味します。二重ラインフィード/改行にマッチするだけでは行かないでしょう。最低でも、エンコーディングが何であるか把握するためにリクエストヘッダーを解析し、必要に応じてリクエスト本文を処理する必要があります。

    複雑さを理解するために、libcurlまたは利用可能なオープンソースのWebサーバーを参照してください。

  • 0

    あなたが持っている計画はほぼ正しいと思います。目的のパターン'\r\n\r\n'が見つかるまで、読み取ったデータをバッファにロードしたままにしておく必要があります。要求全体を処理ロジックに渡し、バッファから要求を削除して繰り返します。

    +0

    いいえ。 \ r \ n \ r \ nヘッダーを終了します。本文は、Content-Lengthまたはそのチャンクの終了、またはHTTP 1.0のEOSのみで終了します。 – EJP

    0

    これは、あなたがブロッキングソケットかノンブロッキングソケットかによって異なります。

    • 非ブロッキングソケットの場合、0を返し、errnoにEAGAINを設定できます。それはちょうど、0が
    +0

    私はBerkeleyソケットのデフォルトを使っていますが、ブロックされているのかブロックされていないのかは分かりません。 – drunkmonkey

    +1

    -1はEAGAINの場合は0ではなく、返されます。recv/read/recvmsgが0を返すと、もう一方の端がTCP接続を閉じたことを意味します。 – nos

    +0

    @drunkmonkeyデフォルトでブロックされています。 – EJP

    関連する問題