LinuxSir.cn,穿越时空的Linuxsir!

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

请解释一下这个赋值语句?多谢!

[复制链接]
发表于 2004-4-12 17:53:35 | 显示全部楼层 |阅读模式
static int check_tcp_packet(struct sk_buff *skb)
{
     struct tcphdr *thead;
     ......
//----------------------------------------------------------
      thead = (struct tcphdr *)(skb->data +
                                (skb->nh.iph->ihl * 4));
//---------------------------------------------------------
              /* Now check the destination port */
      if ((thead->dest) == *(unsigned short *)deny_port)
      {
         return NF_DROP;
      }
         
          return NF_ACCEPT;
}


skb->data +(skb->nh.iph->ihl * 4)
是什么意思啊?

不明白的地方是:
1。为什么要加上skb->data这个偏移量?
2。下面的结构前几句的#define语句看不懂(我知道大小ENDIAN的区别,但觉得ihl:4这种写法实在晦涩难懂,它的作用?)
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
        __u8        ihl:4,
                version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
        __u8        version:4,
                  ihl:4;
#else
#error        "lease fix <asm/byteorder.h>"
#endif
        __u8        tos;
        __u16        tot_len;
        __u16        id;
        __u16        frag_off;
        __u8        ttl;
        __u8        protocol;
        __u16        check;
        __u32        saddr;
        __u32        daddr;
        /*The options start here. */
};
发表于 2004-4-14 09:48:26 | 显示全部楼层
结构体(struct tcphdr*是说明改类型的结构体指针
用->表示下面的成员,如果是struct tcphdr的话是用。来引用
那段东西应该表示两部分的内容加起来然后副给前面的变量吧
 楼主| 发表于 2004-4-15 00:16:04 | 显示全部楼层
还是不懂...
发表于 2004-4-19 13:59:25 | 显示全部楼层
第一个问题:
    thead = (struct tcphdr *)(skb->data +(skb->nh.iph->ihl * 4));
    这一句是使tcp头指针thead指向由skb->data所指数据区, 偏移量为(skb->nh.iph->ihl * 4) 乘以skb->data的类型大小(比如long是4,char 是1)的位置,该位置是tcp头.
    注意指针偏移单位是以基指针(这里是skb->data)的类型大小为最小单位偏移的.  如long *p, 则p+1偏移了4字节,而char *q,则q+1偏移了1字节.

第二个问题:
    __u8 ihl:4,
    version:4;
    写到一行:  __u8 ihl:4, version:4;
    它定义了两个结构成员, ihl和version, 但它们存储在一个__u8存储单元中,各占4比特.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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