gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:20:05 24 4
gpt4 key购买 nike

我正在尝试构建一个简单的 TCP HTTP 客户端,它获取图像的 url 作为参数,下载它并将其写入 stdout,以便它可以通过管道传输到文件。

我的程序中的下载似乎工作正常,但我无法提取 HTTP 内容和写入标准输出。相关代码如下:

#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,因此应该很适合放入缓冲区。

如果有人能让我走上正轨,那就太好了!

最佳答案

这里的函数:

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

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

关于C: 如何从 HTTP 响应中正确提取二进制内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47254442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com