1

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

有什么好的解决方案可以满足我的要求吗?谢谢!

4

1 回答 1

1

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

于 2013-04-09T15:13:22.130 回答