error: field ‘ifru_hwaddr’ has incomplete type

在这里插入图片描述
在这里插入图片描述
这两种编译出错的问题,是linux/if.h和net/if.h来源于不同的包,两个之间是可以互换的,如果选择linux/if.h,则可能依赖于已编译二进制文件的内核版本。 所有新库版本都坚持使用net/if.h而不是linux版本,可以尝试这样换一下。
也有以下的其他解决方法,都尝试一下。
linux/if.h和net/if.h的不同

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`struct ifreq` 是一个用于获取和设置网络接口属性的结构体,定义在 `<net/if.h>` 头文件中。具体定义如下: ```c struct ifreq { char ifr_name[IFNAMSIZ]; /* 接口名称 */ union { struct sockaddr ifru_addr; struct sockaddr_in ifru_addr_ipv4; struct sockaddr_in6 ifru_addr_ipv6; struct sockaddr_storage ifru_addr_storage; ... /* 其他地址类型 */ } ifr_ifru; unsigned short ifr_flags; /* 接口标志 */ ... }; ``` 其中,`IFNAMSIZ` 是一个宏定义,表示接口名称的最大长度。`ifr_name` 表示接口名称,它的长度不能超过 `IFNAMSIZ`。 `ifr_ifru` 是一个联合体,用于表示不同类型的接口地址。它包含了多个成员,例如 `ifru_addr` 表示通用的地址类型,`ifru_addr_ipv4` 表示 IPv4 地址类型,`ifru_addr_ipv6` 表示 IPv6 地址类型等等。根据需要使用不同的成员即可。 `ifr_flags` 表示接口的状态标志,例如是否启用、是否广播等等。它的类型是一个无符号短整型。 在使用 `struct ifreq` 时,通常需要使用 `ioctl()` 函数来获取和设置接口属性。`ioctl()` 函数的定义如下: ```c int ioctl(int fd, unsigned long request, ...); ``` 其中,`fd` 表示文件描述符,`request` 表示请求代码,后面可能跟有参数(取决于请求代码)。使用 `ioctl()` 函数时,需要将一个指向 `struct ifreq` 结构体的指针作为参数传递给它,例如: ```c struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); strcpy(ifr.ifr_name, "eth0"); /* 设置接口名称 */ ioctl(sockfd, SIOCGIFHWADDR, &ifr); /* 获取 MAC 地址 */ ``` 这里使用 `SIOCGIFHWADDR` 请求代码来获取 MAC 地址,将结果保存在 `ifr` 结构体中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值