2013-04-09 32 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