gpt4 book ai didi

c - c中的基本http代理,问题

转载 作者:可可西里 更新时间:2023-11-01 16:39:05 25 4
gpt4 key购买 nike

我正在用 c 构建一个 http 代理。代理应该过滤 URL 和 html 内容中的一些关键字。我遇到的第一个问题是 send() 函数。当我第一次加载页面时,一切都很好。如果我让页面完成加载,下一个请求也可以。但是,如果我打开 www.google.com 并开始键入“即时功能”,则在最后一个请求完成之前发出新请求,我会收到以下错误:

Program received signal SIGPIPE, Broken pipe.
0x00007ffff7b2efc2 in send () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) up
#1 0x0000000000401f1a in main () at net-ninny2.c:232
232 bytes_sent += send(i, buffer+bytes_sent, buffer_size-bytes_sent, 0);

产生错误的代码块如下所示:

while(bytes_sent < buffer_size) {
bytes_sent += send(i, buffer+bytes_sent, buffer_size-bytes_sent, 0);
printf("* Bytes sent to Client: %d/%d\n", bytes_sent, buffer_size);
}

如果您认为相关,我很乐意提供更多代码。

我的第二个问题与 Http header 有关。由于我要过滤html内容中的关键字,所以我不想对内容进行编码。 Google 似乎不同意这一点,无论我在 Accept-Encoding -header 中放入什么,我总是会以 gzip 编码返回内容。任何想法如何摆脱它?

编辑:

我也在尝试使用 fork() 为新连接创建子进程,但这只会引发一个严重的错误:

select: Interrupted system call

我把它放在从传入连接创建新文件描述符的地方:

if (i == listener) {
// New connection
remote_addr_len = sizeof remote_addr;
newfd = accept(listener, (struct sockaddr *)&remote_addr, &remote_addr_len);

if (newfd == -1) {
perror("accept");
}
else {
FD_SET(newfd, &master); // Add new connection to master set
if (newfd > fdmax) {
fdmax = newfd;
}
printf("* New connection from %s on "
"socket %d\n",
inet_ntop(remote_addr.ss_family,
get_in_addr((struct sockaddr*)&remote_addr),
remoteIP, INET6_ADDRSTRLEN), newfd);
if(!fork()) {
fprintf(stderr, "!fork()\n");
close(newfd);
exit(5);
}
}
}

但我猜我做错了。

干杯!

最佳答案

对于第一个问题,您需要忽略 SIGPIPE 信号:

signal(SIGPIPE, SIG_IGN);

参见 How to prevent SIGPIPEs (or handle them properly)了解更多详情。如果忽略该信号并重置套接字连接,您还需要适本地处理 send()-1 错误返回值。

对于第二个问题,您可能无法强制 Google 发送未压缩的数据,因为 Google 可能假定所有浏览器都可以处理压缩数据。您可能需要在代理中嵌入一个 gzip 解压缩器。仅仅因为要过滤一些关键字就增加两端的带宽需求,这当然是不公平的。

关于c - c中的基本http代理,问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9220923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com