在这段代码中,有一行:
在
struct iphdr * iph = (struct iphdr *)buffer;
在
ProcessPacket
函数中,buffer
的类型为char*
。在主函数中,recvfrom
已经给buffer
赋值。如何将简单字符串(buffer
)转换为结构体,并如何安全地提取数据?
iphdr:
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos;
__u16 tot_len;
__u16 id;
__u16 frag_off;
__u8 ttl;
__u8 protocol;
__u16 check;
__u32 saddr;
__u32 daddr;
/*The options start here. */
};
buffer
中的数据并不是一个字符串,这是需要知道的重要信息。相反,它只是一大块字节,恰好对应于该结构。 - Some programmer dudeunit8_t *buffer = (uint8_t *)&yourStruct
,那么返回时将正常工作:yourStruct* str = (yourStruct *)buffer
。否则,应执行memcpy
。 - ringbuffer_peekrecvfrom
编辑一个数据字符串以填充其中的数据包。如果它对应于结构,则打印编辑后的字符串必须包含头数据,而不仅仅是字符串,但实际上并没有发生这种情况。 - Deepesh Choudhary