ioctl()
함수와 요청 코드를 사용하여 네트워크 인터페이스 플래그를 가져올 때 구조를 매개변수로 SIOCGIFFLAGS
제공해야 합니다 . struct ifreq
이 구조에는 네트워크 인터페이스의 이름과 호출이 반환될 때 요청된 플래그로 채워지는 필드가 포함되어 있습니다.
struct ifreq
:
구조는 다음과 같이 정의됩니다.
struct ifreq {
char ifr_name[IFNAMSIZ]; // Interface name
union {
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 interface
if (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()
위의 예에서는 먼저 호출을 위한 임시 소켓을 만듭니다 . 그런 다음 플래그를 "enp5s0"으로 설정합니다 ifr_name
. 이는 이 인터페이스를 쿼리한다는 것을 나타냅니다. 호출 후에 ioctl()
는 ifr_flags
"enp5s0" 인터페이스에 대한 플래그가 포함됩니다.