【发布时间】:2013-04-09 14:58:43
【问题描述】:
我正在编写一个 TCP 代理服务器程序,它有一些类似 sn-ps 的代码:
// 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 捕获为每个传入 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
有什么好的解决方案可以满足我的要求吗? 谢谢!
【问题讨论】:
标签: c networking network-programming multiprocessing libpcap