c - 在 C 中获取 HTTP 响应的大小

标签 c http sockets networking getaddrinfo

我正在构建一个模糊器(Web 应用程序安全工具),但在构建代理服务器时遇到了一些问题。下面是我的函数代码,它接收 char* http 消息,将 ascii 格式的主机名转换为 IP 地址,然后与该主机建立连接,转发请求。然后它接收响应并将其发送回客户端。

我以前在 C++ 中使用 Boost 库完成过此操作,但我真的想控制我正在做的事情,所以我选择用 C 编写它。我面临的问题是我没有得到返回整个响应,因此不会将 http 请求的内容部分发送回客户端。我必须使响应字符串有多大才能处理任何长度的请求?除了将字符串大小设置得大得离谱之外,还有更好的方法吗?

我做了一些研究,似乎使用 getaddrinfo 是发出请求的方式,但我不是很熟悉。我也收到此错误消息:

malloc: *** error for object 0x7fb8a8c04fe8: incorrect checksum for freed object - object was probably modified after being freed.

我最初认为这是因为我没有为字符串上的空终止符腾出空间,但看起来这不是问题所在。

此外,如果您发现任何其他明显的错误或问题,请随时指出它们

int sock;
struct addrinfo hints, *res, *res0;
int error;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(hostname, "http", &hints, &res0);
if(error){
    puts("Error translating hostname");
    exit(1);
}
int reslen;
char* response = malloc(strlen(message)+1 * sizeof(char));
for(res = res0; res; res= res->ai_next){
    sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if(sock < 0) puts("sock is < 0");
    if(connect(sock, res->ai_addr, res->ai_addrlen) < 0){
        fprintf(stderr, "Error connecting to %s\n", hostname);
    }
    write(sock, message, len);
    reslen = read(sock, response, kMaxMess);
    response[reslen] = '\0';
}
close(sock);
return response;

最佳答案

好吧,HTTP 请求实际上可以是任何 大小(例如,大量的 header 或发布的表单数据)。如果您真的需要将所有内容都放在一个大字符串中,则必须分块读取它并根据需要重新分配您的缓冲区以包含所有内容。

但请注意,HTTP 请求还可以包含带有嵌入 NUL 字符的二进制数据。因此,您确实应该返回一个长度以及您的缓冲区,以便您可以安全地处理 NUL。

或者,如果您只需要解析响应而不存储它,您可以考虑在读取每个 block 时增量解析它。这样您就不必将整个响应都记在内存中。

关于c - 在 C 中获取 HTTP 响应的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14907996/

相关文章:

http - Angular 2 (TypeScript) : Unable to bind to object from http. 获取 HTML 模板

c - 如何将 curl 响应存储在 c 中的变量中

iphone - 如何在 iPhone 上从 URL 接收数据?

python - pygame事件在几秒钟的延迟后响应

Java Socket 编程不适用于 10,000 个客户端

c - 重新排列字符串字母

c - c 错误 : declaration shadows a variable in the global scope

c - 如何在 NASM for Linux 中正确使用 C 函数 "Exp"?

c - 套接字没有加入多播组,但它可以接收数据。

java - 使用套接字将对象从android发送到java(Hibernate类)