2

我真的不明白写这篇文章的兴趣

   struct iphdr *ip;
   struct icmphdr *icmp;
   char *packet;
   packet = malloc(sizeof(struct iphdr) + sizeof(struct icmphdr));
   ip = (struct iphdr *)packet;

为什么要packet作为char, 并且,假设为什么不写packet = malloc(sizeof(struct iphdr));或者更简单ip = malloc(sizeof(struct iphdr));呢?

4

2 回答 2

3

根据维基百科, icmp 标头在 IP 标头之后立即开始,因此实现者会考虑将一块内存分配在一起并使其指向数据包。

您可以进一步检查您的代码以了解如何进一步使用数据包。数据包的全部内容可能会附加到来自上层的某些数据中。

于 2013-05-28T11:48:28.513 回答
1

看起来代码正在分配一个 IP 数据包,其中嵌入了一个 ICMP 数据包作为 IP 有效负载。这就是为什么它的大小malloc()足以容纳两个结构。

这样做的原因是为了让您获得一块连续的内存来表示数据包。如果您分别分配iphdr和 ,icmphdr它们很可能位于内存的 2 个不相交部分,因此无法传递给sendto().

请注意,因为代码定义了 IP 标头IP_HDRINCL套接字选项,所以必须在套接字上启用,以便套接字层不会自动生成 IP 标头。

packet其视为一个大缓冲区。然后*ip*icmp设置为指向该缓冲区中的正确位置,以便可以使用结构对其进行初始化,而不必将原始字节复制到结构中。

于 2013-05-28T11:50:34.937 回答