c语言中超大内存指针的分配
我真的不明白写这篇文章的兴趣c语言中超大内存指针的分配,c,pointers,struct,C,Pointers,Struct,我真的不明白写这篇文章的兴趣 struct iphdr *ip; struct icmphdr *icmp; char *packet; packet = malloc(sizeof(struct iphdr) + sizeof(struct icmphdr)); ip = (struct iphdr *)packet; 为什么要将数据包作为字符,假设是这样,为什么不编写数据包=malloc(sizeof(struct iphdr))或更简单的ip=malloc(
struct iphdr *ip;
struct icmphdr *icmp;
char *packet;
packet = malloc(sizeof(struct iphdr) + sizeof(struct icmphdr));
ip = (struct iphdr *)packet;
为什么要将
数据包
作为字符
,假设是这样,为什么不编写数据包=malloc(sizeof(struct iphdr))代码>或更简单的ip=malloc(sizeof(struct iphdr))代码>?根据wikipedia,icmp报头在IP报头之后立即启动,因此实现者会想到一起分配一块内存并使其指向数据包
您可以进一步检查代码,以进一步了解数据包的使用情况。数据包的全部内容可能被预先添加到上面层的一些数据中。根据维基百科,icmp报头在IP报头之后立即启动,因此实现者会考虑一起分配一块内存,并使其指向数据包
您可以进一步检查代码,以进一步了解数据包的使用情况。数据包的全部内容可能被预先添加到上面层的一些数据中。看起来代码正在分配一个IP数据包,其中嵌入了一个ICMP数据包作为IP有效负载。这就是为什么malloc()
的大小足以容纳这两个结构的原因
这样做的原因是为了得到一块连续内存来表示数据包。如果您分别分配了iphdr
和icmphdr
,它们很可能位于内存的两个不相交部分,因此无法传递到sendto()
注意,由于代码正在定义IP头IP_HDRINCL
socket选项,因此必须在套接字上启用,以便套接字层不会自动生成IP头
将数据包
看作一个大缓冲区。然后将*ip
和*icmp
设置为指向该缓冲区中的正确位置,以便可以使用结构对其进行初始化,而不必将原始字节复制到结构中。看起来代码正在分配一个ip数据包,其中嵌入了一个icmp数据包作为ip有效负载。这就是为什么malloc()
的大小足以容纳这两个结构的原因
这样做的原因是为了得到一块连续内存来表示数据包。如果您分别分配了iphdr
和icmphdr
,它们很可能位于内存的两个不相交部分,因此无法传递到sendto()
注意,由于代码正在定义IP头IP_HDRINCL
socket选项,因此必须在套接字上启用,以便套接字层不会自动生成IP头
将数据包
看作一个大缓冲区。然后将*ip
和*icmp
设置为指向该缓冲区中的正确位置,以便可以使用结构对其进行初始化,而不必将原始字节复制到结构中。它是否继续icmp=(struct icmphdr*)(packet+sizeof(struct iphdr))代码>?我猜作者希望结构彼此相邻以表示位置。好的,谢谢,这很有趣。它是否继续icmp=(struct icmphdr*)(packet+sizeof(struct iphdr))代码>?我猜作者希望结构彼此相邻以便于定位。好的,谢谢,这确实很有趣