Frage

Ich möchte ein Netzwerk-Geräte überprüfen Status z.B. Promiscuous Mode. Im Grunde genommen wie gezeigt mit ip a Befehl.

Vielleicht hat jemand könnte mich schieben in die richtige Richtung?

Das möchte ich für Linux in C tun, damit Linux-spezifische Header zur Verfügung stehen.

War es hilfreich?

Lösung

Sie müssen die SIOCGIFFLAGS ioctl verwenden, um die Fahnen mit einer Schnittstelle verbunden sind abzurufen. Anschließend können Sie überprüfen, ob die IFF_PROMISC Flag gesetzt ist:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>     
#include <sys/ioctl.h>  /* ioctl()  */
#include <sys/socket.h> /* socket() */
#include <arpa/inet.h>  
#include <unistd.h>     /* close()  */
#include <linux/if.h>   /* struct ifreq */

int main(int argc, char* argv[])
{
    /* this socket doesn't really matter, we just need a descriptor 
     * to perform the ioctl on */
    int fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    struct ifreq ethreq;

    memset(&ethreq, 0, sizeof(ethreq));

    /* set the name of the interface we wish to check */
    strncpy(ethreq.ifr_name, "eth0", IFNAMSIZ);
    /* grab flags associated with this interface */
    ioctl(fd, SIOCGIFFLAGS, &ethreq);
    if (ethreq.ifr_flags & IFF_PROMISC) {
        printf("%s is in promiscuous mode\n",
               ethreq.ifr_name);
    } else {
        printf("%s is NOT in promiscuous mode\n",
               ethreq.ifr_name);
    }

    close(fd);

    return 0;
}

Wenn Sie auf Satz die Schnittstelle in den Promiscuous-Modus, werden Sie root-Rechte benötigen, aber Sie können das Feld in ifr_flags und verwenden Sie die SIOCSIFFLAGS ioctl einfach eingestellt:

/* ... */
ethreq.ifr_flags |= IFF_PROMISC;
ioctl(fd, SIOCSIFFLAGS, &ethreq);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top