gpt4 book ai didi

c - 指针和 libPcap

转载 作者:行者123 更新时间:2023-11-30 15:44:00 26 4
gpt4 key购买 nike

使用 pcap,我声明了 rtp 结构,当我尝试指向数据包的这个区域时,我发现根据我的声明,它以不同的方式工作。

我写的是:

struct udphdr *udp;
struct rtphdr *rtp, *rtp2;
udp = (struct udphdr*) (packet + sizeof(struct ether_header) + (ip->ip_hl*4));
rtp = (struct rtphdr*) (packet + sizeof(struct ether_header) + (ip->ip_hl*4) + sizeof(struct udphdr));
rtp2 = (struct rtphdr*) (udp + sizeof(struct udphdr));
printf("UPD header: %p\n",udp);
printf("RTP header 1: %p\n",rtp);
printf("RTP header 2: %p\n",rtp2);

输出是:

UDP header: 0x7fcea3802222

RTP header 1: 0x7fcea380222a

RTP header 2: 0x7fcea3802262

为什么第一个声明添加了 8 个字节的 UDP header (0x2a - 0x22 = 0x8),而另一个声明则添加了更多。

谢谢

最佳答案

指针算术在 C(以及 C++ 和 Objective-C 和 Objective-C++)中的工作方式是假定指针指向数组的第 N 个元素,如果将 K 添加到指针,则结果指向到同一数组的第 N+K 个元素。

这意味着,在字节可寻址机器上(您的机器是字节可寻址的,因为使用 C 编译器的非字节可寻址机器运行的操作系统不支持 libpcap),如果您有一个指向M 字节长的对象,如果将 K 添加到该指针,则与该加法结果对应的地址将比该指针中的地址晚 M*K 字节。

因此,除非您有一个指向 1 字节值的指针,否则向指针添加 sizeof 值并不是您想要做的事情。

这意味着

rtp2 = (struct rtphdr*) (udp + sizeof(struct udphdr));    

是错误的。如果 udp 指向 UDP header ,并且您想要指向过去的 UDP header ,则需要执行以下任一操作

rtp2 = (struct rtphdr*) (udp + 1);    

rtp2 = (struct rtphdr*) ((char *)udp + sizeof(struct udphdr));    

我假设pointer是一个指向charunsigned char的指针,就像传递给libpcap回调一样,所以你的算术使用 pointer 进行的操作是正确的。

关于c - 指针和 libPcap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19665090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com