从pcap中缓存捕获的数据包

3
这是对这个问题的跟进:Rebuilding a packet to inject via pcap 我想要完成的目标:
1. functionA:使用pcap捕获数据包。修改源/目的地址。重新计算校验和。使用pcap注入。 2. functionB:创建两个线程。线程1发送魔术包以唤醒睡眠客户端。线程2使用pcap捕获数据包,并将数据包缓存到u_char *数组中,因为pcap将数据包数据序列化到“u_char * packet”中。当两个线程终止时,我更改标题然后注入每个缓存的数据包。
我需要帮助的地方:
1. functionA:我可以做到一切,但无法计算校验和。我尝试使用函数自己计算原始校验和进行验证,但它们从未匹配。然而,这个问题不那么重要,因为我不需要它来演示我的最终项目。我知道如果IP校验和不正确,接收计算机将丢弃数据包。但是,在我的演示中,只要能够显示我的客户端计算机已经接收到了这个不正确的数据包,我就证明了我的整体概念,不会失败。 :) 2. functionB:我想这是更重要的问题。我不知道缓存捕获的数据包的简单方法。我正在处理以下内容:
functionB创建指向存储u_char *的数组的指针,称为cachedPackets。所以cachedPackets基本上指向存储“字符串”的数组。
它将是这样的吗?u_char ** cachedPackets[100],足够100个数据包的数组元素。
之后,我启动两个线程。Thread1唤醒我的睡眠客户端。Thread2打开另一个pcap会话,因此在唤醒客户端时不会丢失数据。Thread1很容易,我已经独立测试了我的发送魔术包函数。Thread2是我搞砸的地方。
Thread2最终调用int pcap_loop(pcap_t *p, int cut, pcap_handler callback, u_char *user)
callback是在捕获每个数据包后运行的函数。这是我将数据包缓存到数组中的位置。
callback采用参数(u_char* user,const struct pcap_pkthdr* packet_header,const u_char* packet_data) 用户与pcap_loop的第4个参数中的相同字符串。
所以我想,我可以通过类型转换巧妙地将我的回调函数给出指向字符串数组的指针。 pcap_loop(asdf,asdf,callback,(u_char *)cachedPackets);

由于我不知道传入的数据包有多大,因此在回调函数中动态分配足够的空间。我还将使用静态int变量来跟踪数组中的位置。

以下是回调函数的示例:

void cacheCall(u_char * user, const struct pcap_pkthdr * header, const u_char * packet)

    static int cacheindex = 0;

    u_char ** cachethis = (u_char **)user; 

    //u_char * cachething = *cachethis;
    (*cachethis)[cacheindex] = (u_char *) malloc(header->len); <--- 497


    int i = 0;

    for(i = 0; i < header->len; i++)
    {
        (*cachethis)[cacheindex][i] = packet[i]; <-------------------503
    }

    //memcpy(cachething[cacheindex], packet, header->len);
    cacheindex++;

但是当我编译时,出现了以下错误:
497: warning: assignment makes integer from pointer without a cast
503: error: subscripted value is neither array nor pointer

这段话有些冗长,但我希望我的工作知识并非完全错误。任何帮助都将不胜感激! :)
1个回答

1
u_char ** cachethis;

cachethis 是一个指向指针的 u_char 类型。

因此:

*cachethis

是一个指向u_char的指针,并且:

(*cachethis)[i]

是一个普通的u_char

因此,第497行尝试将指针存储到u_char中,而第503行尝试对u_char进行下标操作,这两者都是无效的。

看起来你想要的只是:

cachethis[i]

并且

cachethis[i][j]

太棒了!编译过程一点问题都没有,但我有点害怕运行它哈哈。担心会出现段错误。 - maoshouse
所以只是为了确保,当我使用for循环,配合正确的代码,我将把所有的u_chars存储到我的缓存中,对吗? - maoshouse
我承认我没有完全阅读你的帖子,只看了错误部分,所以我不知道周围的其他内容是否正确。事实上,将u_char*强制转换为u_char**非常可疑。重写代码,使您不必使用指针转换,这样您就会更安全。 (如果可能的话,请调查使用容器库或可能的C ++容器的可能性。) - Mat
关于您的第二条评论:是的,您将存储在第497行分配的内存区域中。 - Mat
好的,非常感谢。出乎意料的是,我的pthread也没有出现故障。这看起来非常不错。感谢你的帮助! - maoshouse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接