2013-04-09 65 views
0

我正在寫一個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 

有什麼好的解決方案可以滿足我的要求嗎? 謝謝!

回答

0

但是,您的要求並不完全清楚,但是,如果您啓動的線程不是pcap_loop您應該爲每個數據包獲取一個回調。您可以隨時處理這些數據。您可能不想爲每個接受打開一個新的捕獲,因爲緩衝/調度可能意味着您將丟失小包。

+0

我改寫了這個問題。問題是代理和不同的客戶端(使用不同的IP)之間有很多tcp連接。我想要捕獲每個客戶端的HTTP請求數據包。 – misteryes 2013-04-09 15:33:16