我想了解最后一行的作用:
int PCKT_LEN = 8192;
char buffer[PCKT_LEN];
struct iphdr *ip = (struct iphdr *) buffer;
struct udphdr *udp = (struct udphdr *) (buffer + sizeof(struct iphdr));
我知道这个,我有点理解:
(struct udphdr *) -> Means cast to a udphdr "object"/instance or something like that.
这个我不懂:
(buffer + sizeof(struct iphdr))
这个我不太明白。是否因为它使用缓冲区返回的地址,然后在开始分配 udp 内存范围之前添加缓冲区的实际大小,直到最后一个字节作为偏移量? 我猜它想在 ip 之后开始 udp 地址?
如果我像下面那样执行最后一行,它会是一样的吗? (我将buffer更改为ip)
struct udphdr *udp = (struct udphdr *) (ip + sizeof(struct iphdr));
(我是 CPP 的新手,刚刚开始了解指针和结构。)
它只是说有一个内存缓冲区
buffer
,其中包含一个iphdr
结构(*ip
),紧接着是一个udphdr
结构(*udp
)。
第二行将
udp
指针设置为内存中 ip
结构末尾之后的一个字节。 (它获取基指针,然后将其前进 iphdr
结构在内存中所需的字节数)
注意,除了
buffer
内存之外,绝对不涉及任何分配。该代码只是将平面数组 buffer
与包含 udp 数据包的内存结构“叠加”。通常这样做是为了能够从平面缓冲区的明确定义的偏移量中选取字节。 (访问 udp->flags
比访问 *(buffer + offset)
更有意义)