首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取C中HTTP响应的大小

获取C中HTTP响应的大小
EN

Stack Overflow用户
提问于 2013-02-16 07:21:01
回答 1查看 1.8K关注 0票数 1

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

我以前使用Boost库在C++中这样做过,但是我真的想要控制我正在做的事情,所以我选择用C来编写它。我面临的问题是,我没有得到整个响应,所以http请求的内容部分不会被发送回客户机。要使响应字符串能够处理任意长度的请求,必须使用多大的响应字符串?是否有更好的方法来做到这一点,而不仅仅是将字符串的大小设置得太大了?

我做了一些研究,似乎使用getaddrinfo是提出请求的方法,但我对它不太熟悉。我还得到了这样一个错误,即:

代码语言:javascript
复制
malloc: *** error for object 0x7fb8a8c04fe8: incorrect checksum for freed object - object was probably modified after being freed.

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

此外,如果你看到任何其他明显的错误或问题,请随时指出他们。

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-16 07:29:12

实际上,HTTP请求可以是任意大小的(例如,大量的标头或已发布的表单数据)。如果您真的需要在一个大字符串中全部使用它,那么您将不得不以块的形式读取它,并在必要时realloc您的缓冲区来包含它。

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

或者,如果您只需要在不存储响应的情况下解析响应,则可以在读取每个块时考虑增量解析它。这样你就不用把所有的反应都记在记忆里了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14907996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档