我正在编写一个 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
我想在proxy和webserver之间做什么和这个问题无关反正客户端会依次发送一个TCP SYN包、TCP ACK包和一个HTTP请求包。
代理可能会接受来自许多客户端的大量传入 TCP 3 次握手和 HTTP 请求。我想为每个传入的 TCP 连接获取 TCP ACK 数据包和 HTTP 请求数据包(它也是一个 TCP 数据包),包括 IP 标头和 TCP 标头。如果我无法获取TCP ACK
,至少,我想获取 HTTP 请求数据包(包括 IP 头和 TCP 头)。
一种方法是使用 libpcap 捕获为每个传入 TCP 连接设置了 ACK 标志的数据包(filter_exp 类似于 tcp[tcpflags] & (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
有什么好的解决方案可以满足我的要求吗?谢谢!