2010-06-16 2 views
3

Я хотел бы проверить состояние сетевых устройств, например. непробиваемый режим. В основном, как показано с помощью команды ip a.Как проверить состояние сетевых устройств в C?

Возможно, кто-то может подтолкнуть меня в правильном направлении?

Я хочу сделать это в C для linux, поэтому доступны конкретные заголовки linux.

ответ

6

Чтобы извлечь флаги, связанные с интерфейсом, вам необходимо использовать ioctl SIOCGIFFLAGS. Затем вы можете проверить, если IFF_PROMISC флага установлен:

#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; 
} 

Если вы хотите установить интерфейс к беспорядочному режиму, вам нужны привилегии, но вы можете просто установить поле в ifr_flags и использовать SIOCSIFFLAGS ioctl:

/* ... */ 
ethreq.ifr_flags |= IFF_PROMISC; 
ioctl(fd, SIOCSIFFLAGS, &ethreq); 
+0

thats it. благодаря –

Смежные вопросы