2011-12-19 6 views
2

私はCで単純なhttpページリクエスタを作っています。ソケットを使ってホストにHTTP/1.0 GETリクエストを送り、その答えを解析してhtmlファイルを効果的にダウンロードします。私はこのような要求を送信するとき しかし、:私のHTTP/1.0 GET要求はOKですが、本体コンテンツは返されません。

GET http://stackoverflow.com/questions HTTP/1.0 
User-Agent: myRequester/1.0 

それはこの

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Date: Mon, 19 Dec 2011 15:28:08 GMT 
Content-Length: 54362 
Connection: close 

しかし、無本文の内容を返します。

はい、すべての行の末尾にはCRLFを、最後には空白行を追加しました。 1つの接続で1つのソケットのみを使用します。そして、私はHTTP/1.0に固執する必要があります。

+0

実際に完全な応答をお待ちしていますか?これらのヘッダーは、サーバーが本文を送信していることを示します。 – ibid

+0

はい、確信しています。私は、recv()の戻り値で答えの長さをチェックし、その後もstrlen()でバッファを編集しました。 – alexdantas

+0

しかし、最後まで読んでいますか? recvは必ず1回の呼び出しで完全な応答を読み取るわけではありません。 recvが接続が終了したことを報告するまで呼び出しを繰り返す必要があります。 – ibid

答えて

3

最も可能性の高い説明は、サーバーが実際に本文を送信していますが、すべてを読むわけではありません。ほとんどのネットワーキングシステムは、たとえより多くのデータが予期されていても、すぐに利用できるデータがすぐに返されることが有用であると考えているため、必ずしもすべての応答を1つの関数呼び出しで返すわけではありません。

Unixシステムコールrecvは、接続が終了するとゼロを返します。ゼロまたはエラーが発生するまで、それを呼び出す必要があります。

+0

絶対に正しいです。このような質問を無駄にして申し訳ありません。 – alexdantas

関連する問題