Supprimer les informations d’en-tête HTTP

En C, existe-t-il un moyen d’exclure les informations d’en-tête HTTP fournies avec les données lors de l’utilisation de recv() sur un socket? J’essaie de lire des données binarys et tout ce que je veux, ce sont les informations binarys réelles, pas les informations d’en-tête HTTP. Les données actuelles reçues ressemblent à ceci:

 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 ╪ α 

Je voudrais seulement lire la partie binary du fichier. (Ce n’est évidemment pas tout le binary, seulement cela a été affiché depuis que j’ai imprimé la sortie de ma boucle recv sous forme de chaîne et que le premier caractère NULL se situe après cette petite chaîne binary).

Je dois juste me débarrasser de la partie en-tête. Existe-t-il un moyen simple de procéder?

Je pense que vous devez extraire la valeur de Content-Length pour connaître la taille des données binarys à lire, sinon il sera impossible de savoir si toutes les données ont été reçues. Une approche simple pour consumr et surtout ignorer la partie en-tête consiste à lire les données entrantes octet par octet jusqu’à ce que "\r\n\r\n" soit rencontré, ce qui indique la fin de la section d’en-tête et le début de le contenu.

Vous feriez mieux d’utiliser une bibliothèque d’parsing HTTP telle que curl

Si vous voulez le faire vous-même:

Vous pouvez rechercher '\r\n\r\n' (deux \r\n ) qui séparent les en-têtes HTTP et le contenu, puis utiliser ssortingng / buffer.

En outre, vous devez obtenir Content-Length partir de l’en-tête et lire autant d’octets que contenu http.

Quelque chose comme:

 /* 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, ssortingpped down http headers */ 

Remarque: assurez-vous que strstr ne surcharge pas la mémoire, utilisez peut-être strnstr (vous strnstr pas sûr que cela existe ou non) ou des fonctions similaires.