захват / получение TCP-пакетов с заголовком IP / TCP в многопроцессорной программе

Я пишу программу прокси-сервера 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

есть ли хорошие решения, отвечающие моим требованиям? Благодарность!


person misteryes    schedule 09.04.2013    source источник


Ответы (1)


Ваши требования не совсем ясны для меня, однако, если вы запустите поток, который выполняет pcap_loop, вы должны получить обратный вызов для каждого пакета. Затем вы можете обрабатывать эти данные по своему усмотрению. Вероятно, вы не захотите открывать новый захват для каждого принятия, поскольку буферизация / планирование может означать, что вы потеряете пакеты.

person Paul Rubel    schedule 09.04.2013
comment
Я перефразировал вопрос. Проблема в том, что между прокси и разными клиентами (с разными IP) существует множество TCP-соединений. Я хочу захватить пакет HTTP-запроса от каждого клиента. - person misteryes; 09.04.2013