我正在进行套接字编程,需要在Linux上解析数据包。 Linux提供的一般框架是拥有缓冲区(u_char*
),将其转换为以太网头(假设它是以太网),读取下一个协议(例如IP),移动指针并将其转换为IP头,然后转到下一个协议(例如TCP)。
所以我关注的是大胆的部分:我们怎样才能确保移动指针合法?通常人们只检查协议并假设数据包已完成。但我怀疑这是否总是如此。
例如:
const u_char* packet = ...; // Receive the packet
struct ethhdr* ethHdr = (struct ethhdr*)packet;
if (ntohs(ethHdr->h_proto) == ETH_P_IP) {
struct ip* ipHdr = (struct ip*)(packet + sizeof(struct ethhdr));
}
那么对于第四行,为什么我们相信这样的指针添加是安全的?有没有办法检查长度?
提前致谢!