Я создаю http прокси в c.Прокси должен фильтровать некоторые ключевые слова в URL и в HTML-контенте.Первая проблема у меня с функцией send ().Когда я загружаю страницу в первый раз, все в порядке.И если я разрешу странице финскую загрузку, то следующий запрос тоже подойдет.Но если я открываю www.google.com и начинаю печатать, «Instant-Feature» делает новый запрос до того, как последний будет завершен, и я получаю следующую ошибку:
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.Так как я хочу фильтровать ключевые слова в html-контенте, я не хочу, чтобы контент был закодирован.Похоже, Google не согласен с этим, и что бы я ни указывал в заголовке Accept-Encoding, я всегда получаю обратно содержимое, закодированное в gzip.Любые идеи, как избавиться от этого?
EDIT:
Я также пытаюсь использовать 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);
}
}
}
Но я предполагаю, что все делаю неправильно.
Ура!