pcap中不同线程中的数据包处理程序

时间:2014-05-12 07:44:37

标签: c multithreading pthreads libpcap packet-sniffers

我正在尝试使用pcap并希望它以某种方式工作,一旦我收到数据包,我希望独立处理该数据包,而我的pcap_loop()仍会嗅探其他传入的数据包。

这样我就可以处理我的数据包并等待指定时间的ACK。如果我没有收到确认,我会采取其他措施。

我不明白的是如何在数据包被嗅探之后为数据包创建一个线程。因此每个数据包都是独立于另一个数据包处理的。

所以它会是这种东西,

    pcap_loop(handle, -1, got_packet, NULL)

创建pthread时,我应该在哪里获取

的代码
    pthread_create(pthread_t, NULL, &got_packet, NULL)

感谢您的帮助!

以下代码只捕获一个数据包,然后退出。

已修改为包含代码段:

struct parameter {
    u_char *param1;
    const struct pcap_pkthdr *param2;
    u_char *param3;
};

pcap_loop(handle, -1, create_thread, NULL);

void create_thread(u_char *args, const struct pcap_pkthdr *header, u_char *packet)
{
 struct parameter thrd_args;
 thrd_args.param1 = args;
 thrd_args.param2 = header;
 thrd_args.param3 = packet;

 pthread_t packet_handler;

 pthread_create(&packet_handler, NULL, &got_packet, (void *)&thrd_args);
 error handling....
 pthread_exit(NULL);

}

void *got_packet(void *thrd_args)
{
struct parameters *thread_args;
thread_args = thrd_args;

u_char *args = &thread_args->param1;
const struct pcap_pkthdr *header = &thread_args->param2;
u_char *packet = &thread_args->param3;

}

2 个答案:

答案 0 :(得分:2)

您是否有充分的理由在不同的线程中处理数据包处理? pcap驱动程序会将数据包存储在队列中,因此如果它们在处理先前的数据包时到达,您将不会错过它们(当然,这取决于您在创建嗅探器时声明的缓冲区大小)。尽管如此,你应该在你的got_packet函数中创建线程(每次数据包被嗅探时都会被pcap驱动程序调用)并给它一个不同处理函数的地址,如下所示:pthread_create(pthread_t, NULL, &process_packet, NULL) 。当然,你需要以某种方式将数据包传递给你的新处理线程,但我会留下让你弄清楚。

答案 1 :(得分:1)

我做的有点不同,也许这对任何人都有帮助。一旦pcap_loop收到数据包,请调用相应的函数,在其中创建新线程并与pthread_detach()一起执行return 0。新线程将处理数据包,pcap将以相同的方式处理另一个线程中的另一个数据包。
然后,您将获得与接收数据包一样多的线程。