【问题标题】:capture/get TCP packets with IP/TCP header in a multiple-process program在多进程程序中捕获/获取带有 IP/TCP 标头的 TCP 数据包
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 我重新表述了这个问题。问题是代理和不同的客户端(具有不同的 IP)之间有许多 tcp 连接。我想从每个客户端捕获 HTTP 请求包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多