7

recv()Cでは、ソケットで使用するときにデータに付属するHTTPヘッダー情報を除外する方法はありますか?いくつかのバイナリデータを読み取ろうとしていますが、必要なのは実際のバイナリ情報であり、HTTPヘッダー情報ではありません。受信した現在のデータは次のようになります。

HTTP/1.1 200 OK
Content-Length: 3314
Content-Type: image/jpeg
Last-Modified: Tue, 20 Mar 2012 14:51:34 GMT
Accept-Ranges: bytes
ETag: "45da99f1a86cd1:6b9"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Mon, 20 Aug 2012 14:10:08 GMT
Connection: close 

╪ α

ファイルのバイナリ部分のみを読み取りたいのですが。(これは明らかにすべてのバイナリではありません。recvループからの出力を文字列として出力し、最初のNULL文字がその小さなバイナリ文字列の後にあるため、表示されたのはその量だけです)。

ヘッダー部分を削除する必要がありますが、これを行う簡単な方法はありますか?

4

2 に答える 2

9

curlのようなHTTP解析ライブラリを使用する方が良いでしょう

自分でやりたい場合:

HTTPヘッダーとコンテンツを区切る'\r\n\r\n'(2つ)を検索し、その後文字列/バッファを使用できます。\r\n

Content-Lengthまた、ヘッダーから取得し、そのバイト数をhttpコンテンツとして読み取る必要があります。

何かのようなもの:

/* http_resp has data read from recv */
httpbody = strstr(http_resp, "\r\n\r\n");
if(httpbody) 
    httpbody += 4; /* move ahead 4 chars
/* now httpbody  has just data, stripped down http headers */

注:strstrメモリをオーバーランしないようにしてください。 strnstr(これが存在するかどうかはわかりませんが)または同様の機能を使用している可能性があります。

于 2012-08-20T14:26:00.363 に答える
8

読み取るバイナリデータのサイズを知るには、の値を抽出する必要があると思います。Content-Lengthそうしないと、すべてのデータが受信されたかどうかを知ることができなくなります。"\r\n\r\n"ヘッダー部分を消費し、ほとんど無視する簡単な方法は、ヘッダーセクションの終わりとコンテンツの始まりを示す、検出されるまで着信データをバイトごとに読み取ることです。

于 2012-08-20T14:26:16.347 に答える