免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2547 | 回复: 4
打印 上一主题 下一主题

[C] IP数据包报头解析,求大神解答一下偏移问题。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-20 10:54 |只看该作者 |倒序浏览
本帖最后由 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位?

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2012-12-20 11:07 |只看该作者
unsigned short c=htons(c); ??

论坛徽章:
0
3 [报告]
发表于 2012-12-20 13:46 |只看该作者
                unsigned short c=htons(b);

论坛徽章:
0
4 [报告]
发表于 2012-12-20 14:38 |只看该作者
回复 2# hellioncu
丢人了。。但主要是下面那个问题求解答。。。

   

论坛徽章:
0
5 [报告]
发表于 2012-12-20 19:28 |只看该作者
自己顶顶,撒泼打滚求指点啊~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP