在多进程程序中捕获/获取带有IP / TCP头的TCP数据包

时间:2013-04-09 14:58:44

标签: c networking network-programming multiprocessing libpcap

我正在编写一个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 3次握手和HTTP请求。 我想得到TCP ACK数据包和HTTP请求数据包(它也是一个TCP数据包)用于每个传入TCP连接包括IP头和TCP头。如果我至少无法获得TCP ACK,我想获取HTTP请求数据包(包括IP标头和TCP标头)。

一种方法是使用libpcap来捕获为每个INCOMING TCP连接设置ACK标志的数据包(filter_exp就像tcp [tcpflags]&amp;(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

有没有符合我要求的好解决方案? 谢谢!

1 个答案:

答案 0 :(得分:0)

但是,如果你,我的要求并不完全清楚 启动一个执行 pcap_loop 的线程,你应该得到每个数据包的回调。然后,您可以按照自己的意愿处理该数据。您可能不希望为每个接受打开一个新的捕获,因为缓冲/调度可能意味着您将丢失数据包。