我正在构建一个模糊器(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;