Chinaunix首页 | 论坛 | 博客
  • 博客访问: 358198
  • 博文数量: 46
  • 博客积分: 4936
  • 博客等级: 上校
  • 技术积分: 575
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-25 20:14
文章分类

全部博文(46)

文章存档

2012年(4)

2011年(1)

2010年(23)

2009年(18)

分类: LINUX

2010-03-19 14:23:16

struct sk_buff *sb               
根据下图可以得出通过
struct tcphdr *tcph = (struct tcphdr*)(sb->h.th);
可以得出tcp包头,但是实际上得不到,反而通过下面的办法可以得到
struct tcphdr *tcph = (struct tcphdr*)(sb->data+(sb->nh.iph->ihl*4));
可问题该方法的链路层包头怎么没有计算呢?
按说一个数据包应该是
链路包头14字节
然后是ip包头
tcp包头(假设数据包是tcp的)
可是
struct tcphdr *tcph = (struct tcphdr*)(sb->data+(sb->nh.iph->ihl*4));
这个办法是没有链路层包头的啊?
请问是怎么回事?


Godbach:

你需要了解那几个union中的指针分别在什么时候才有效。

你说的情况就是union中的指针还不是有个有效指针。

rain_fish:
    哦,明白了,还有个问题就是
struct tcphdr *tcph = (struct tcphdr*)(sb->data+(sb->nh.iph->ihl*4));
是不是应该是struct tcphdr *tcph = (struct tcphdr*)(sb->data+14(链路层包头)+(sb->nh.iph->ihl*4));
?

Godbach :
不用加MAC len。你之所以没有理解正确,还是我说的那个问题。skb中有些成员是会随着skb在不同的协议层而变化的,比如skb->data就是这样的成 员。
因此,建议LZ看一下分析sk_buff数据结构的文章,充分的理解这个结构体中若干关键成员的含义。


阅读(2489) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~