获取C中的HTTP响应大小

时间:2013-02-16 07:21:01

标签: 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;

1 个答案:

答案 0 :(得分:2)

嗯,HTTP请求实际上可以是任何大小(例如,大量的标题或发布的表单数据)。如果你真的需要一个大字符串,你必须在块中读取它,并根据需要realloc缓冲区来包含它。

但请注意,HTTP请求还可以包含嵌入了NUL个字符的二进制数据。所以,你真的应该和你的缓冲区一起返回一个长度,这样你就可以安全地处理NUL了。

或者,如果您只需解析响应而不存储它,则可以考虑在读取每个块时逐步解析它。这样你就不必把整个反应都留在记忆中了。