2016-04-02 6 views
0

以下のコードを使用してメッセージからHTTP受信ヘッダーを取得したい場合がありますが、時にはうまく機能しないことがあります。recv()関数でのHTTPヘッダーの一貫性のない処理

ここ

を送信するために私のコードです:

send(s, message, strlen(message), 0) 

そして、これは私がデータを受信する方法である:

int memory = 1; 
int d = 0; 
header = malloc(memory * sizeof(char)); 
if (header == NULL) { 
    printf("Error, memory\n"); 
    return 1; 
} 
while (recv(s, header + d, 1,0)>0) { 
    if(strstr(header, "\r\n\r\n") != NULL) 
     break; 

    d++; 
    if (d >= memory) { 
     memory *= 2; 
     header = realloc(header, memory); 
     if (header == NULL) { 
      printf("Error, memory\n"); 
      return 1; 
     } 
    } 
} 

私はそれmallocといくつかの問題だと思うが、私はどこ見つけることができません。

Header: 
HTTP/1.1 200 OK 
Date: Sat, 02 Apr 2016 02:35:07 GMT 
Last-Modified: Tue, 24 Feb 2015 20:49:22 GMT 
ETag: "7ab4-50fdba7431880;50c0cc9312bdc" 
Accept-Ranges: bytes 
Content-Length: 31412 
Cache-Control: max-age=2592000 
Expires: Mon, 02 May 2016 02:35:07 GMT 
P3P: policyref="http://www.w3.org/2014/08/p3p.xml" 
Vary: upgrade-insecure-requests 
Access-Control-Allow-Origin: * 
Connection: close 
Content-Type: image/png; qs=0.7 

そして、これはapk-dlによると、失敗したメッセージからのものです::

これが成功するには、w3.orgによると、ヘッダを受信

Header: 
HTTP/1.1 200 OK 
gEp7qN_agFirScA9OVXmWLV8ofyAZngl0Q_Sc-K50=h500.png HTTP/1.1 
Host: apk-dl.com 
Connection: close 

はどうやって取得することができますヘッダーを正しくかつ一貫してデコードする機能はありますか?

答えて

2

recv()によって返された結果を正しく、完全に処理できなかったり、null終端が保証されていない文字配列に対してstrxxx()呼び出しを誤ったりしたために機能しません。 1バイト以下のメッセージのみを転送できるTCPプロトコルとmallocの誤用 - ヘッダバッファに1バイトしか割り当てません。

0

strstr関数はCスタイルの文字列にのみ使用できます。任意のデータには使用できません。 1つの可能性は、thisのようなタイプの関数memmemを使用することです。

HTTP 1.1要求の送信をやめ、HTTP 1.0要求を送信することを強くお勧めします。 HTTP 1.1クライアント(チャンクエンコーディングの処理など)を作成するには、多分対処したくないことがたくさんあります。

+0

まだ動作しません、私はmemmenに変更し、HTTP要求を1.0に変更しました。まだ私はヘッダーの一部だけを取得します。 'ヘッダ: HTTP/1.1 200 OK 日:土、2016年4月2日午前3時00分33秒GMT のContent-Type:画像/ PNG 接続:クローズ のSet-Cookie:__cfduid = d88ceea80daa7c7da249e58e3e ' – Qunts

関連する問題