我正在寫一個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
我希望代理和Web服務器之間做無關這個問題 無論如何,客戶端會發送一個TCP SYN包,TCP ACK數據包和HTTP請求數據包順序。
該代理可能接受來自許多客戶端的大量傳入TCP 3次握手和HTTP請求。 我想獲得TCP ACK數據包和HTTP請求數據包(它也是一個TCP數據包)爲每個傳入TCP連接,包括IP標頭和TCP標頭。如果我不能得到TCP ACK
,至少我想獲取HTTP請求數據包(,包括IP標頭和TCP標頭)。
一個方法是使用libpcap的捕捉與ACK標誌組分組爲每個傳入的TCP連接(filter_exp是如TCP [tcpflags] &(TCP-ACK)!= 0)
以這種方式,如果我把下面的代碼塊之前接受(),則所有傳入的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
有什麼好的解決方案可以滿足我的要求嗎? 謝謝!
我改寫了這個問題。問題是代理和不同的客戶端(使用不同的IP)之間有很多tcp連接。我想要捕獲每個客戶端的HTTP請求數據包。 – misteryes 2013-04-09 15:33:16