Я пишу программу прокси-сервера TCP, в ней есть несколько фрагментов кода, например:
// proxy server listen, waiting for incoming tcp requests
listen(listenfd, 1024);
while(1) {
connfd = accept(listenfd, (struct sockaddr *)&sender_addr, &sock_len);
pid=fork();
if(pid=0) // child process
{
// processing this connection
}
blabla.....
}
когда HTTP-клиент инициирует TCP-соединение с прокси, процесс
client ------ TCP SYN ---------> proxy
client <------TCP SYN/ACK ------ proxy
client -------TCP ACK ---------> proxy
client ------HTTP request -----> proxy
то, что я хочу сделать между прокси-сервером и веб-сервером, не имеет ничего общего с этим вопросом. В любом случае клиент будет последовательно отправлять пакет TCP SYN, пакет TCP ACK и пакет запроса HTTP.
Прокси-сервер может принимать много входящего трехстороннего подтверждения TCP и HTTP-запросов от многих клиентов. Я хочу получить пакет TCP ACK и пакет запроса HTTP (он также является пакетом TCP) для КАЖДОГО входящего TCP-соединения, включая заголовок IP и заголовок TCP. Если я не могу получить TCP ACK
, по крайней мере, я хочу получить пакет HTTP-запроса (включая заголовок IP и заголовок TCP).
один из способов - использовать libpcap для захвата пакетов с установленным флагом ACK для КАЖДОГО ВХОДЯЩЕГО TCP-соединения (filter_exp похоже на tcp [tcpflags] & (tcp-ack)! = 0)
таким образом, если я помещу следующий блок кода перед accept (), тогда все входящие TCP-соединения могут использовать один и тот же обработчик pcap, но если я помещу следующий блок кода в каждый дочерний процесс после fork (), обработчик может пропустить какой-то TCP пакеты
handle = pcap_open_live(dev, BUFSIZ, 0, 0, errbuf);
pcap_compile(handle, &fp, filter_exp, 0, mask) == -1
pcap_setfilter(handle, &fp);
struct pcap_pkthdr pcap_header; // The header that pcap gives us
const u_char *pcap_packet; // The actual packet
есть ли хорошие решения, отвечающие моим требованиям? Благодарность!