2013-03-30 4 views
6

Titel ziemlich sagt alles. Wenn ich ifconfig laufen, bekomme ich diese:Wie überprüft man, ob die Schnittstelle ist

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 
    inet -snip- netmask 255.255.255.0 broadcast -snip- 
    ... 

diese verwenden, kann ich wissen, ob es nach oben oder nicht (<UP,...), aber ich möchte in der Lage sein, dies in C zu tun (oder C++, wenn es eine ist einfachere Lösung), ohne auf die Analyse externer Prozesse angewiesen zu sein.


Hier ist, was ich bisher habe (nicht funktioniert):

bool is_interface_online(std::string interface) { 
    struct ifreq ifr; 
    int sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP); 
    memset(&ifr, 0, sizeof(ifr)); 
    strcpy(ifr.ifr_name, interface.c_str()); 
    if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) { 
      perror("SIOCGIFFLAGS"); 
    } 
    close(sock); 
    return !!(ifr.ifr_flags | IFF_UP); 
} 

Kann mir jemand für diese in die richtige Richtung?

+2

ifconfig ist open source btw – Slava

Antwort

12

Die Antwort war einfach: Ich habe den bitweisen Operator OR (|) anstelle des Operators AND (&) verwendet. Festcode ist:

bool is_interface_online(std::string interface) { 
    struct ifreq ifr; 
    int sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP); 
    memset(&ifr, 0, sizeof(ifr)); 
    strcpy(ifr.ifr_name, interface.c_str()); 
    if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) { 
      perror("SIOCGIFFLAGS"); 
    } 
    close(sock); 
    return !!(ifr.ifr_flags & IFF_UP); 
} 
+1

Ich habe es auch auf meiner Fedora 18 Maschine getestet, funktioniert gut. –

3

Haben Sie darüber nachgedacht, die strace Befehl zu sehen, wie ifconfig funktioniert? Sie können sogar sehen, welche Parameter an Funktionen übergeben werden und andere interessante Details, wie ifconfig funktioniert ..

+2

Ja, ich habe tatsächlich die Funktion benutzt, um die Funktion zu schreiben: D – MiJyn

2

Wenn Sie über den up/down-Zustand der Schnittstelle interessieren, möchten Sie möglicherweise die "IFF_RUNNING" -Flag anstelle der "IFF_RUNNING" -Flag IFF_UP "-Flag, das von der aktuellen Antwort bereitgestellt wird.