【发布时间】:2017-06-30 07:22:26
【问题描述】:
代码here中有一行:
struct iphdr * iph = (struct iphdr *)buffer;
在ProcessPacket 函数中,其中buffer 的类型为char*。 buffer 已在主函数中由 recvfrom 赋予值。简单字符串(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中的数据不是字符串,这是要知道的重要一点。相反,它只是一大块字节,恰好对应于结构。 -
如果以这种方式写入缓冲区:
unit8_t *buffer = (uint8_t *)&yourStruct,那么返回就可以了:yourStruct* str = (yourStruct *)buffer。否则,应该执行memcpy。 -
@Some程序员老兄
recvfrom编辑一串数据来填充其中的数据包数据。如果它对应于结构,那么打印编辑的字符串也必须包含标题数据,而不仅仅是字符串,但这不会发生。 -
您收到的数据是二进制数据,不对应任何可以打印的字符。它(再次)是 not 字符串(在 C 或 C++ 意义上)。这就像从文件中读取非文本二进制数据,您希望能够打印它吗?还是将数据用作字符串?