- 论坛徽章:
- 0
|
本帖最后由 pretendinxian 于 2012-12-20 15:13 编辑
定义IP数据包报头如下:
struct ip_header
{
u_int8_t ip_version:4,ip_head_len:4;
u_int8_t ip_tos;
u_int16_t ip_len;
u_int16_t ip_id;
u_int16_t ip_off;
u_int8_t ip_ttl;
u_int8_t ip_protocol;
u_int16_t checksum;
struct in_addr source_ip_address;
struct in_addr destination_ip_address;
};
void ip_packet_classy(const char * pcap_content)
{
strcut ip_header * ip_head=(struct ip_header *)(pcap_content+sizeof(ether_header));
printf("IP Version:%d\n",ip_head->ip_version);
printf("IP Length:%d\n",ip_head->ip_len*4);
offset=ip_head->ip_off;
printf("IP Offset:%d\n",(offset&0x1fff)*8);
}
解析数据包的时候,为什么ip_version可以直接读出,而ip_header_length 必须ip_header_length*4,是向左偏移了4位吧?offset是怎么读出的,偏移和标识不是共用了一个16位么,是怎么赋值怎么取数的?为什么要左移8位,而不是右移8位? |
|