イメージのURLを引数として取得し、ダウンロードしてstdoutに書き込む単純なTCP HTTPクライアントを構築しようとしています。ファイルにパイプすることができます。C:HTTP応答からバイナリコンテンツを正しく抽出する方法
私のプログラムのダウンロードは正しく動作しているようですが、HTTPコンテンツの抽出とstdoutへの書き込みを動作させることはできません。私は43KBであるため、バッファに快適にフィットする必要があり、テストのためのthis画像を、使用してい
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#define BUF_SIZE 1024
#define RESP_BUF_SIZE 2000000
void extract_http_body(char *resp_buf, char *data) {
data = strstr(resp_buf, "\r\n\r\n") + 4;
}
int main(int argc, char* argv[]) {
int sockfd, received;
char host[BUF_SIZE], path[BUF_SIZE], send_buf[BUF_SIZE], resp_buf[RESP_BUF_SIZE], data[RESP_BUF_SIZE];
char HTTP_PORT[3] = "80";
struct addrinfo hints, *res, *p;
/* SOCKET STUFF HERE, WORKS FINE */
/* Recv response */
if ((received = recv(sockfd, resp_buf, RESP_BUF_SIZE-1, 0)) == -1) {
perror("Error while receiving response.");
exit(1);
}
resp_buf[received] = '\0';
extract_http_body(resp_buf, data);
fwrite(data, strlen(data), 1, stdout);
close(sockfd);
return 0;
}
:ここに関連するコードです。
誰かが正しいトラックに私を置くことができれば素晴らしいだろう!ここ
私はあなたの2番目の提案を試み、 'strstr'から' char * 'を返し、' char * data; 'にそれを格納しました。これはテキストボディでうまく動作しますが、イメージはまだ破損しています(ファイルサイズははるかに小さくなります)。 'fwrite(data、strlen(data)、1、stdout);の問題でしょうか?私は 'fwrite(data、sizeof(* data)、1、stdout);'を試しましたが、役に立たなかった。 – user8793
はい、画像データにゼロバイトが含まれている可能性が高いので、最初の文字列が見つかると 'strlen'が停止します。たとえば 'write_len = received - (data-resp_buf)'のように 'received'を使って有効なバイト数を計算します。 (cr-lf-cr-lfがない場合、 'data'が最初にヌルでないかどうかを確認してください)。 – alain