C:如何从HTTP响应中正确提取二进制内容

时间:2017-11-12 21:56:11

标签: c http-headers stdout

我正在尝试构建一个简单的TCP HTTP客户端,它将图像的url作为参数,下载并将其写入stdout,然后将其传送到文件。

我的程序中的下载似乎工作正常,但我无法获取HTTP内容的提取和写入stdout工作。以下是相关代码:

#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;
}

我使用this图像进行测试,这是43kB,因此应该可以很好地适应缓冲区。

如果有人能让我走上正轨,那将会很棒!

1 个答案:

答案 0 :(得分:1)

这个功能在这里:

void extract_http_body(char *resp_buf, char *data) {
    data = strstr(resp_buf, "\r\n\r\n") + 4;
}

只会将本地data变量设置为strstr的返回值。您不会在该功能之外看到此值 您可以返回值:

char* extract_http_body(char *resp_buf) {
    return strstr(resp_buf, "\r\n\r\n") + 4;
}

或传递指向指针的指针:

void extract_http_body(char *resp_buf, char **data) {
    *data = strstr(resp_buf, "\r\n\r\n") + 4;
}

然后,您在data中将main()声明为数组。这需要您将内容从resp_buf复制到data,这是不必要的。相反,您可以将data声明为char*,并使用上述内容将其设置为resp_buf内数据的开头,并避免不必要的副本。