LinuxSir.cn,穿越时空的Linuxsir!

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

一个指针问题

[复制链接]
发表于 2005-5-13 16:05:29 | 显示全部楼层 |阅读模式
一个程序中出现如下语句,其中的"-2"我不理解,为什么要向前移动呢?哪位兄台指导一下

  1. .......
  2. struct etherpacket
  3. {
  4.      struct ethhdr eth;
  5.      struct iphdr  ip;
  6.      struct tcphdr tcp;
  7.      char buff[8192];
  8. }ep;
  9. struct iphdr *ip;
  10. ...........

  11. ip=(struct iphdr *)(((unsigned long)&ep.ip)-2);
复制代码
发表于 2005-5-13 16:41:34 | 显示全部楼层
好象是字节对齐的关系。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-13 16:51:01 | 显示全部楼层
谢谢,可还是不太明白,能说详细一点吗?
回复 支持 反对

使用道具 举报

发表于 2005-5-13 17:09:26 | 显示全部楼层
我知道是什么原因,只能说他的代码很烂。可能想像他的ethhdr是这样定义:
struct ether
{
    unsigned char dest[6];
    unsigned char src[6];
    unsigned short type;
};
这样,由于这个结构被嵌在struct etherpacket里,由于编译优化实现占用了16个字节,这样与ip域之间就多出来两上字节的空隙,他这么做的原因就是把那两个字节减回来。
实际上只需在定义ethhdr结构时,加入"__attribute__ ((packed))"就可以了。
另外,他在结构里tcphdr紧跟着iphdr也不对,因为IPv4报头是变长的,所以结构中tcp域并不一定可以指到真正的tcp报头。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-13 17:52:00 | 显示全部楼层
非常感谢
回复 支持 反对

使用道具 举报

发表于 2005-5-13 18:27:35 | 显示全部楼层
Tetris 兄好强啊
我们坛子里又多了位牛淫呵呵
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-13 20:07:23 | 显示全部楼层
如何能够快速查找到库对这些结构的定义?比如说tcphdr?
回复 支持 反对

使用道具 举报

发表于 2005-5-13 22:20:09 | 显示全部楼层
:)
如果你用的是Linux,在/usr/include/net/ethernet.h有以太网报结构的定义。ip, tcp, icmp, udp的在/usr/include/netinet/里。
回复 支持 反对

使用道具 举报

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

本版积分规则

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