免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3053 | 回复: 4
打印 上一主题 下一主题

[学习分享] 结构体后面的变量相加是怎样解释好 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-01-10 16:04 |只看该作者 |倒序浏览
本帖最后由 清楚山下 于 2017-01-10 16:09 编辑

#define  ETH_HLEN  14
struct arppacket
{
        unsigned short        ar_hrd;                                /*硬件类型*/
        unsigned short        ar_pro;                                /*协议类型*/
        unsigned char        ar_hln;                                /*硬件地址长度*/
        unsigned char        ar_pln;                                /*协议地址长度*/
        unsigned short        ar_op;                                /*ARP操作码*/
        unsigned char        ar_sha[ETH_ALEN];        /*发送方MAC地址*/
        unsigned char*        ar_sip;                        /*发送方IP地址*/
        unsigned char        ar_tha[ETH_ALEN];        /*目的MAC地址*/
        unsigned char*        ar_tip;                        /*目的IP地址*/

};
int main(int argc, char*argv[])
{
        char ef[ETH_FRAME_LEN];                          /*以太帧缓冲区*/
        struct ethhdr*p_ethhdr;                                /*以太网头部指针*/
        /*目的以太网地址*/
        char eth_dest[ETH_ALEN]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
        /*源以太网地址*/
        char eth_source[ETH_ALEN]={0x00,0x0C,0x29,0x73,0x9D,0x15};
                                                                                /*目的IP地址*/
        
        int fd;                                                       /*fd是套接口的描述符*/
        fd = socket(AF_INET, SOCK_PACKET, htons(0x0003));
        
        /*使p_ethhdr指向以太网帧的帧头*/
        p_ethhdr = (struct ethhdr*)ef;
        /*复制目的以太网地址*/
        memcpy(p_ethhdr->h_dest, eth_dest, ETH_ALEN);
        /*复制源以太网地址*/
        memcpy(p_ethhdr->h_source, eth_source, ETH_ALEN);
        /*设置协议类型,以太网0x0806*/
        p_ethhdr->h_proto = htons(0x0806);
        
        struct arppacket*p_arp;        
        p_arp = (struct arppacket*) (ef + ETH_HLEN);                                /*定位ARP包地址*/
        p_arp->ar_hrd = htons(0x1);                        /*arp硬件类型*/
        p_arp->ar_pro = htons(0x0800);                /*协议类型*/
        p_arp->ar_hln = 6;                                        /*硬件地址长度*/
        p_arp->ar_pln = 4;                                        /*IP地址长度*/
        /*复制源以太网地址*/
        memcpy(p_arp->ar_sha, eth_source, ETH_ALEN);
        /*源IP地址*/
        p_arp->ar_sip=(unsigned char*)inet_addr("192.168.1.152");
        /*复制目的以太网地址*/
        memcpy(p_arp->ar_tha, eth_dest, ETH_ALEN);
        /*目的IP地址*/
        p_arp->ar_tip = (unsigned char*)inet_addr("192.168.1.1");
        
        /*发送ARP请求8次,间隔1s*/
        int i = 0;
        for(i=0;i<8;i++){
                write(fd, ef, ETH_FRAME_LEN);/*发送*/
                sleep(1);                                                /*等待1s*/
        }
        close(fd);
        return 0;
}



p_arp = (struct arppacket*) (ef + ETH_HLEN);                                /*定位ARP包地址*/
结构体后面的变量相加是怎样解释好呢?

论坛徽章:
72
20周年集字徽章-20	
日期:2020-10-28 14:04:30操作系统版块每日发帖之星
日期:2016-07-13 06:20:0015-16赛季CBA联赛之广夏
日期:2016-07-10 09:04:02数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00操作系统版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-04 06:20:00数据库技术版块每日发帖之星
日期:2016-07-03 06:20:00操作系统版块每日发帖之星
日期:2016-07-03 06:20:00数据库技术版块每日发帖之星
日期:2016-07-02 06:20:00操作系统版块每日发帖之星
日期:2016-07-02 06:20:00
2 [报告]
发表于 2017-02-17 09:46 |只看该作者
p_arp = (struct arppacket*) (ef + ETH_HLEN);   

ef 是一个 char 类型的指针,ef + ETH_HLEN 也表示一个指针,这个指针指向的是 ef + ETH_HLEN*sizeof(char) 所在的地址空间

论坛徽章:
72
20周年集字徽章-20	
日期:2020-10-28 14:04:30操作系统版块每日发帖之星
日期:2016-07-13 06:20:0015-16赛季CBA联赛之广夏
日期:2016-07-10 09:04:02数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00操作系统版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-04 06:20:00数据库技术版块每日发帖之星
日期:2016-07-03 06:20:00操作系统版块每日发帖之星
日期:2016-07-03 06:20:00数据库技术版块每日发帖之星
日期:2016-07-02 06:20:00操作系统版块每日发帖之星
日期:2016-07-02 06:20:00
3 [报告]
发表于 2017-02-17 09:48 |只看该作者
这个是简单的指针运算,你可以看一下C语言编程里面关于指针的描述

论坛徽章:
72
20周年集字徽章-20	
日期:2020-10-28 14:04:30操作系统版块每日发帖之星
日期:2016-07-13 06:20:0015-16赛季CBA联赛之广夏
日期:2016-07-10 09:04:02数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00操作系统版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-04 06:20:00数据库技术版块每日发帖之星
日期:2016-07-03 06:20:00操作系统版块每日发帖之星
日期:2016-07-03 06:20:00数据库技术版块每日发帖之星
日期:2016-07-02 06:20:00操作系统版块每日发帖之星
日期:2016-07-02 06:20:00
4 [报告]
发表于 2017-02-17 09:51 |只看该作者
p_arp = (struct arppacket*) (ef + ETH_HLEN);  
ef + ETH_HLEN 结果还是一个 char 类型的指针,然后强制转换成 struct arppacket 类型的指针,并将这个指针赋给 p_arp

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
5 [报告]
发表于 2017-02-19 20:52 |只看该作者
指针,c语音的高科技,cpp的foreach->第n轮为新起点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP