【问题标题】:Get size of HTTP response in C在 C 中获取 HTTP 响应的大小
【发布时间】:2013-02-16 07:21:01
【问题描述】:

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

我之前使用 Boost 库在 C++ 中完成了此操作,但我真的想控制我正在做的事情,所以我选择用 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;

【问题讨论】:

    标签: c http sockets networking getaddrinfo


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的,那么我可以在读取有效时执行类似操作,直到它为空。一个简单的循环就可以解决这个问题。我假设 read 读取完整个请求后会返回类似 -1 的内容?
    • read 完成后返回零。如果在读取过程中发生了不好的事情(套接字断开、I/O 错误等),它只会返回 -1。您应该检查来自read 的错误:它们可能表明远程端已经崩溃。此外,如果 reslen 最终为 -1,您将覆盖 response[-1],这是未定义的行为。
    • 太棒了,很高兴知道。节省了我查找手册页的时间。
    • 无论如何都要阅读man page。知道你在用什么总是好的。 (如果您使用的是 Linux/Mac 机器,man 2 read 始终可以使用)。
    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多