struct ifreq具体是什么样子
时间: 2024-03-20 13:41:17 浏览: 10
`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` 结构体中。