设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
编程开发讨论区 —— LinuxSir.cn
›
Linux 程序设计专题讨论
›
一个指针问题
返回列表
查看:
912
|
回复:
7
一个指针问题
[复制链接]
hawfeng
hawfeng
当前离线
积分
30
IP卡
狗仔卡
发表于 2005-5-13 16:05:29
|
显示全部楼层
|
阅读模式
一个程序中出现如下语句,其中的"-2"我不理解,为什么要向前移动呢?哪位兄台指导一下
.......
struct etherpacket
{
struct ethhdr eth;
struct iphdr ip;
struct tcphdr tcp;
char buff[8192];
}ep;
struct iphdr *ip;
...........
ip=(struct iphdr *)(((unsigned long)&ep.ip)-2);
复制代码
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
kj501
kj501
当前离线
积分
5317
IP卡
狗仔卡
发表于 2005-5-13 16:41:34
|
显示全部楼层
好象是字节对齐的关系。
回复
支持
反对
使用道具
举报
显身卡
hawfeng
hawfeng
当前离线
积分
30
IP卡
狗仔卡
楼主
|
发表于 2005-5-13 16:51:01
|
显示全部楼层
谢谢,可还是不太明白,能说详细一点吗?
回复
支持
反对
使用道具
举报
显身卡
Tetris
Tetris
当前离线
积分
264
IP卡
狗仔卡
发表于 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报头。
回复
支持
反对
使用道具
举报
显身卡
hawfeng
hawfeng
当前离线
积分
30
IP卡
狗仔卡
楼主
|
发表于 2005-5-13 17:52:00
|
显示全部楼层
非常感谢
回复
支持
反对
使用道具
举报
显身卡
nait
nait
当前离线
积分
952
IP卡
狗仔卡
发表于 2005-5-13 18:27:35
|
显示全部楼层
Tetris 兄好强啊
我们坛子里又多了位牛淫呵呵
回复
支持
反对
使用道具
举报
显身卡
hawfeng
hawfeng
当前离线
积分
30
IP卡
狗仔卡
楼主
|
发表于 2005-5-13 20:07:23
|
显示全部楼层
如何能够快速查找到库对这些结构的定义?比如说tcphdr?
回复
支持
反对
使用道具
举报
显身卡
Tetris
Tetris
当前离线
积分
264
IP卡
狗仔卡
发表于 2005-5-13 22:20:09
|
显示全部楼层
:)
如果你用的是Linux,在/usr/include/net/ethernet.h有以太网报结构的定义。ip, tcp, icmp, udp的在/usr/include/netinet/里。
回复
支持
反对
使用道具
举报
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表