bcb 编译问题

ml1219 2007-11-19 12:05:57
我有如下代码:
typedef struct arpHead
{
unsigned short hardware_type; //硬件类型
unsigned short protocol_type; //协议类型
unsigned char add_len; //硬件地址长度
unsigned char pro_len; //协议地址长度
unsigned short option; //操作号
unsigned char Sour_MacAddr[6]; //发送者硬件地址
unsigned long Sour_IP; //发送者协议地址
unsigned char Dest_MacAddr[6]; //目的站硬件地址
unsigned long Dest_IP; //目的站协议地址
}ARPHDR;

ARPHDR ArpHead;


//填充ARP报头
ArpHead.hardware_type=htons(0x1);
ArpHead.protocol_type=htons(0x0800);
ArpHead.add_len=6;
ArpHead.pro_len=4;
ArpHead.option=htons(0x1);
ArpHead.Sour_MacAddr[0]=0x00;
ArpHead.Sour_MacAddr[1]=0x11;
ArpHead.Sour_MacAddr[2]=0x11;
ArpHead.Sour_MacAddr[3]=0x43;
ArpHead.Sour_MacAddr[4]=0xAA;
ArpHead.Sour_MacAddr[5]=0x17;

//--------------------有问题这样造成数据结构无法定位-------------------
ArpHead.Sour_IP=inet_addr("172.16.106.35");
//查看内存发现ArpHead.Sour_IP少了两字节数据,少的到那里去了,发现在ArpHead.Dest_MacAddr[0]和ArpHead.Dest_MacAddr[1]里面的,错开了2个字节
for(int i=0;i<6;i++){
ArpHead.Dest_MacAddr[i]=0xFF; //同样的问题,
};
ArpHead.Dest_IP=inet_addr("172.16.106.6");//同样的问题,

//---------------------------------------

//------------------这样写是对的 但完全是无法理解----------------------
int t1=inet_addr("172.16.106.35");
memcpy(&ArpHead.Sour_MacAddr[5]+1,&t1,4); //我不知为什么这样可以 可能是BCB有问题
for(int i=0;i<6;i++){
memset(&ArpHead.Dest_MacAddr[i]-2,0xFF,1);
}; //我不知为什么这样可以 可能是BCB有问题
int t2=inet_addr("172.16.106.6");
memcpy(&ArpHead.Dest_MacAddr[5]-1,&t2,4); //我不知为什么这样可以 可能是BCB有问题
//---------------------------------------------
...全文
75 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ml1219 2007-11-19
  • 打赏
  • 举报
回复
感觉结构体里面的成员 无法定位!!!!!!!!!!
ml1219 2007-11-19
  • 打赏
  • 举报
回复
高手
i_love_pc 2007-11-19
  • 打赏
  • 举报
回复
感觉还是第一种方法正确,第二种方法如果不使用字节对齐的话会有问题。
测试:
        struct in_addr ia;
ArpHead.Sour_IP=inet_addr("172.16.106.35");
ShowMessage(ArpHead.Sour_IP);//显示转换后的unsigned long
ia.S_un.S_addr=ArpHead.Sour_IP;
ShowMessage(inet_ntoa(ia));//重新转换回ip地址字符串"172.16.106.35"

int t1=inet_addr("172.16.106.35");
memcpy(&ArpHead.Sour_MacAddr[5]+1,&t1,4);//Data alignment选Quad word,如果选Byte结果跟上面一样
ShowMessage(ArpHead.Sour_IP);//显示转换后的unsigned long
ia.S_un.S_addr=ArpHead.Sour_IP;
ShowMessage(inet_ntoa(ia));//重新转换回ip地址字符串"106.35.106.35"
i_love_pc 2007-11-19
  • 打赏
  • 举报
回复
注意字节序和数据对齐问题!

Project->Option->Advanced Compiler->Data Alignment

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧