我正在编写一个 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
有什么好的解决方案可以满足我的要求吗?谢谢!