类型转换结构指针

阿尼鲁达

我正在尝试进行Socket编程,并在https://www.tenouk.com/Module43a.html上遇到了一篇文章,由于将char数组如何转换为结构指针,我很难理解

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)可以增加数组。

编辑:Upun进一步检查,这是正在发生的事情:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章