0

使用 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 标头:0x7fcea3802222

RTP 标头 1:0x7fcea380222a

RTP 标头 2:0x7fcea3802262

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

谢谢

4

1 回答 1

1

指针算术在 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 标头,并且您想指向 UDP 标头,则需要执行以下任一操作

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

或者

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

我认为pointer是指向charor的指针unsigned char,就像将交给 libpcap 回调一样,所以你正在使用的算术pointer是正确的。

于 2013-10-29T18:12:47.870 回答