LinuxSir.cn,穿越时空的Linuxsir!

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

关于"Tetris的趋势竞赛 获取网络所有包的信息的例子"的问题

[复制链接]
发表于 2006-2-23 14:42:20 | 显示全部楼层 |阅读模式
Tetris的趋势竞赛 获取网络所有包的信息的例子中这个函数

  1. inline static int __proc_ip_packet(const void *ip, size_t len,
  2.                                    struct ippacket *packet)
  3. {
  4.     unsigned char version;
  5.                                                                                 
  6.     if (len > 0)
  7.     {
  8.         version = *(unsigned char *)ip >> 4;
  9.         if (version == 4)
  10.             return __proc_ip4_packet((const struct ip *)ip, len, packet);
  11. #ifdef IPV6
  12.         else if (version == 6)
  13.             return __proc_ip6_packet((const struct ip6_hdr *)ip, len, packet);
  14. #endif
  15.         else
  16.             errno = EAFNOSUPPORT;
  17.     }
  18.     else
  19.         errno = EBADMSG;
  20.                                                                                 
  21.     return -1;
  22. }
复制代码

version = *(unsigned char *)ip >> 4;
作用是获得version
但是哪位能详细讲解一下*(unsigned char *)ip  是什么意思
他的起点是 传入的第一个参数的起始位置吗
左移4位是什么意思
我看tcp/ip上 ip数据包的格式
包头第一位就是 ip_v 为什么要 <<4呢
对网络编程深入的真是不明白
现在才知道 自己以前的
socket bind listen accept..........是很表面的东西
发表于 2006-2-23 17:36:32 | 显示全部楼层
*(unsigned char *)ip就是取ip的第一个字节
>>是右移,不是左移
ip头的第一个字节的末4个二进制位用来表示版本
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-23 18:08:43 | 显示全部楼层

struct ip
的第一个字节被分成
u_char ip_v:4,
            ip_hl:4;
第一个字节 >> 4 来获取 ip_v
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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