我试图进入Socket编程,并在https://www.tenouk.com/Module43a.html上遇到了一篇文章,但我很难理解将char数组如何转换为struct指针。

char buffer[PCKT_LEN];
struct ipheader *ip = (struct ipheader *) buffer;
//some code here
ip->iph_ihl = 5;
ip->iph_ver = 4;
ip->iph_tos = 16;

根据我的理解,指针ip现在将保存缓冲区的地址,而struct ipheader成员的值现在将存储在缓冲区中。请帮助理解相同的。如果我是对的,那么我们将如何打印存储在缓冲区中的值?

最佳答案

您的理解是正确的。指针* ip将指向缓冲区。 char buffer [PCKT_LEN]是一个大小为sizeof(char)* PCKT_LEN的数组。由于char通常为1个字节长,因此它只是PCKT_LEN个字节的内存块。 PCKT_LEN定义为8192

存储一个struct ipheader所需的字节数比这少得多。尝试int a = sizeof(ipheader)并使用调试器查看分配给a的值。对我来说,它是24个字节,但对您来说可能略有不同。这意味着缓冲区可以容纳的数据多于struct ipheader所需的数据。我没有深入研究代码,对套接字编程也不了解。但是,此方法的一种用途是在结构外部添加额外的数据来增加缓冲区。由于您知道struct ipheader占用了sizeof(ipheader)个字节,因此您将获得sizeof(char)* 8192-剩下的sizeof(ipheader)可以增加数组。

编辑:
进一步检查后,这就是正在发生的情况:

struct ipheader *ip = (struct ipheader *) buffer;
struct udpheader *udp = (struct udpheader *) (buffer + sizeof(struct ipheader));

它尝试将ip header 存储在缓冲区的开头,然后使用udp header 扩展该缓冲区。通过使用buffer + sizeof(struct ipheader)它通过将缓冲区偏移sizeof(struct ipheader)个字节来确保它在ipheader之后存储udp头。基本上struct ipheader *ip指向缓冲区的开始,struct udpheader *udp指向buffer + sizeof(struct ipheader)。我希望这是有道理的。显然,缓冲区中还剩下很多空间,因此您可能会进一步扩大它。

10-08 12:58