Linux-Netzwerkprogrammierung – ioctl() kombiniert mit struct ifreq Anwendungsfall

Wenn wir ioctl()die Funktion und SIOCGIFFLAGSden Anforderungscode verwenden, um das Netzwerkschnittstellen-Flag abzurufen, müssen wir eine struct ifreqStruktur als Parameter bereitstellen. Diese Struktur enthält den Namen der Netzwerkschnittstelle und ein Feld, das bei Rückkehr des Anrufs mit den angeforderten Flags gefüllt wird.

struct ifreq::

Die Struktur ist wie folgt definiert:

struct ifreq {
    
    
    char ifr_name[IFNAMSIZ];   // Interface name
    union {
    
    
        struct sockaddr ifr_addr;
        // ... other members ...
        short ifr_flags;  // Flags
        // ... other members ...
    };
};

Dies ist nur struct ifreqeine vereinfachte Version von , die <net/if.h>in definiert ist.

Wie zu verwenden ioctl()und SIOCGIFFLAGS:

  1. Erstellen Sie eine struct ifreqInstanz.
  2. Stellen Sie ifr_namedas Feld auf den Schnittstellennamen ein, den wir abfragen möchten, z. B. „eth0“.
  3. Wird aufgerufen ioctl()und verwendet SIOCGIFFLAGSden Anforderungscode und unsere struct ifreqInstanz als Parameter.
  4. Wenn der Aufruf zurückkehrt, ifr_flagswird das Feld mit den Flags für diese Schnittstelle gefüllt.

Beispiel:

#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

Im obigen Beispiel erstellen wir zunächst einen ioctl()temporären Socket für den Anruf. Anschließend setzen wir ifr_namedas Flag auf „enp5s0“, was anzeigt, dass wir diese Schnittstelle abfragen möchten. ioctl()Nach dem Aufruf ifr_flagswerden die Flags für die Schnittstelle „enp5s0“ eingebunden.

Supongo que te gusta

Origin blog.csdn.net/weixin_43844521/article/details/133350504
Recomendado
Clasificación