我正在尝试使用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;
}
答案 0 :(得分:2)
您是否有充分的理由在不同的线程中处理数据包处理? pcap驱动程序会将数据包存储在队列中,因此如果它们在处理先前的数据包时到达,您将不会错过它们(当然,这取决于您在创建嗅探器时声明的缓冲区大小)。尽管如此,你应该在你的got_packet函数中创建线程(每次数据包被嗅探时都会被pcap驱动程序调用)并给它一个不同处理函数的地址,如下所示:pthread_create(pthread_t, NULL, &process_packet, NULL)
。当然,你需要以某种方式将数据包传递给你的新处理线程,但我会留下让你弄清楚。
答案 1 :(得分:1)
我做的有点不同,也许这对任何人都有帮助。一旦pcap_loop收到数据包,请调用相应的函数,在其中创建新线程并与pthread_detach()
一起执行return 0
。新线程将处理数据包,pcap将以相同的方式处理另一个线程中的另一个数据包。
然后,您将获得与接收数据包一样多的线程。