当我们使用 ioctl()
函数和 SIOCGIFFLAGS
请求码来获取网络接口的标志时,我们需要提供一个 struct ifreq
结构体作为参数。这个结构体包含了网络接口的名称和一个将被填充的字段,该字段将在调用返回时包含所请求的标志。
struct ifreq
:
该结构体的定义如下:
struct ifreq {char ifr_name[IFNAMSIZ]; // Interface nameunion {struct sockaddr ifr_addr;// ... other members ...short ifr_flags; // Flags// ... other members ...};
};
这只是 struct ifreq
的简化版本,它在 <net/if.h>
中定义。
如何使用 ioctl()
和 SIOCGIFFLAGS
:
- 创建一个
struct ifreq
实例。 - 设置
ifr_name
字段为我们想查询的接口名称,例如 “eth0”。 - 调用
ioctl()
,将SIOCGIFFLAGS
作为请求码和我们的struct ifreq
实例作为参数。 - 当调用返回时,
ifr_flags
字段将被填充为该接口的标志。
示例:
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <unistd.h>int main() {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket");return 1;}struct ifreq ifr;memset(&ifr, 0, sizeof(ifr));strncpy(ifr.ifr_name, "enp5s0", IFNAMSIZ - 1); // Assuming 'enp5s0' as the interfaceif (ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0) {perror("ioctl");close(sockfd);return 1;}close(sockfd);printf("Flags for 'enp5s0': 0x%x\n", ifr.ifr_flags);return 0;
}
majn@tiger:~/C_Project/network_project$ ./ioctl_demo
Flags for 'enp5s0': 0x1143
在上述示例中,我们首先创建了一个用于 ioctl()
调用的临时套接字。然后,我们设置了 ifr_name
为 “enp5s0”,这表示我们想查询这个接口的标志。调用 ioctl()
之后,ifr_flags
将包含 “enp5s0” 接口的标志。