LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 885|回复: 7

下面代码的意思?

[复制链接]
发表于 2004-10-19 15:15:00 | 显示全部楼层 |阅读模式
sk_buff *skb;
struct iphdr *iph=skb->nh.iph;
struct iphdr *dsrhdr=(struct dsr_hdr *)(skb->nh.raw+(iph->ihl)*4);
我不明白(skb->nh.raw+(iph->ihl)*4)指向什么,另外raw一般做什么用
发表于 2004-10-19 16:45:47 | 显示全部楼层

回复: 下面代码的意思?

最初由 ggz 发表
struct iphdr *dsrhdr=(struct dsr_hdr *)(skb->nh.raw+(iph->ihl)*4);

这句的意思是将 (skb->nh.raw+(iph->ihl)*4) 的运算结果转换为 struct dsr_hdr * 这个类型。
 楼主| 发表于 2004-10-19 19:34:15 | 显示全部楼层
我是想问(skb->nh.raw+(iph->ihl)*4)具体指什么意思,有什么含义,可能我的问题不是很准确.
发表于 2004-10-19 23:49:27 | 显示全部楼层
最初由 ggz 发表
我是想问(skb->nh.raw+(iph->ihl)*4)具体指什么意思,有什么含义,可能我的问题不是很准确.

skb->nh.raw + (iph->ihl)*4
发表于 2004-10-20 11:49:16 | 显示全部楼层
我想没有这些结构的定义,很难说清它们到底是什么意思。如果方便,请把它们也一块贴出来。
 楼主| 发表于 2004-10-21 10:19:03 | 显示全部楼层
sk_buff *skb;
struct iphdr *iph=skb->nh.iph;这两个结构是内核默认的
然后struct dsr_hdr 的结构是
struct dsr_hdr {
  __u8  nexthdr;
  __u8  reserved;
  __u16 length;
  /* options start here */
};
发表于 2004-10-21 14:15:54 | 显示全部楼层
sk_buff 是linux内核用于处理网络包的数据结构。
按照对该数据结构定义处的说明来理解,大概是这个意思:
skb->nh是指该数据的网络层头部,skb->nh.raw是一个指向网络层原始数据的指针。skb->nh.iph是指这是一个IP包,按照IP头部的解释方式解释该网络层头部。
skb->nh.raw+(iph->ihl)*4的解释:
skb->nb.raw就是网络层头部的起始地址, iph->ihl是IP头部的长度,以32bit位单位。所以(iph->ihl)*4是IP头部按字节计算的偏移量。skb->nh.raw+(iph->ihl)*4应该就是指向IP数据域的指针。
不知道这样解释是否回答了楼主的问题。
 楼主| 发表于 2004-10-21 14:45:11 | 显示全部楼层
十分感谢bobhuang先生,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表