我正在尝试进行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] 删除。
我来说两句