我正在写一个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