Linux 네트워크 프로그래밍 - struct ifreq 사용 사례와 결합된 ioctl()

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:

  1. 인스턴스를 생성합니다 struct ifreq.
  2. ifr_name필드를 "eth0"과 같이 쿼리하려는 인터페이스 이름으로 설정합니다 .
  3. 호출 코드를 요청 코드로, 인스턴스를 매개변수로 ioctl()사용합니다 .SIOCGIFFLAGSstruct ifreq
  4. 호출이 반환되면 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" 인터페이스에 대한 플래그가 포함됩니다.

Guess you like

Origin blog.csdn.net/weixin_43844521/article/details/133350504