我正在编写一个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
有没有符合我要求的好解决方案? 谢谢!
答案 0 :(得分:0)
但是,如果你,我的要求并不完全清楚 启动一个执行 pcap_loop 的线程,你应该得到每个数据包的回调。然后,您可以按照自己的意愿处理该数据。您可能不希望为每个接受打开一个新的捕获,因为缓冲/调度可能意味着您将丢失数据包。