Wie bekomme ich NIC-Details von einem C-Programm?

7

Ich möchte die folgenden Details für alle Netzwerkkarten erhalten, die an meinen Computer angeschlossen sind:

1) Schnittstellenname (z. B. eth0)

2) Interface-Nummer (wie in Windows ), wenn so etwas unter Linux existiert

>

3) NIC-Bandbreitenkapazität und -modus (z. B. 1 Gb / s Vollduplex)

    
Bruce 10.01.2013, 18:03
quelle

4 Antworten

14

Sie können getifaddrs() / freeifaddrs() verwenden, um eine verknüpfte Liste zu erhalten aller Schnittstellen, dann ioctl(fd, SIOCGIFINDEX, struct ifreq *) , um den Schnittstellenindex für jede Schnittstelle zu erhalten. Da die Schnittstellen fortlaufend sind und immer aufgelistet sind (unabhängig davon, ob sie aktiv sind oder nicht), wähle ich sie mit einer Schleife auf, die stattdessen ioctl(fd, SIOCGIFNAME, struct ifreq *) verwendet. In allen Fällen ist fd ein AF_INET socket.

Um den Duplex und die Geschwindigkeit der Schnittstelle zu erhalten, müssen Sie ioctl(fd, SIOCETHTOOL, struct ifreq *) verwenden, wobei ifr_data auf struct ethtool_cmd mit cmd = ETHTOOL_GSET zeigt.

Die ioctls sollten -1 zurückgeben, wenn sie fehlschlagen, und einen nicht negativen Wert (Null, glaube ich), wenn es erfolgreich ist.

Hier ist ein Beispielprogramm:

%Vor%

Wenn Sie das obige als iflist.c speichern, können Sie es mit

kompilieren %Vor%

Um die Verwendung anzuzeigen, führen Sie iflist -h aus. Um alle Schnittstellen aufzulisten, führe sie ohne Parameter aus:

%Vor%

Im obigen Beispiel wird die von mir beschriebene Aufzählungsmethode verwendet. Um nur bestimmte Schnittstellen aufzulisten, führen Sie sie unter Benennung der Schnittstellen aus:

%Vor%

Duplex und Geschwindigkeit werden natürlich nur für Ethernet-Schnittstellen aufgelistet.

Bearbeitet zum Hinzufügen:

Wenn das obige Programm die Bandbreite und den Modus für eine Schnittstelle nicht liefert, ist hier eine vereinfachte Version, die den genauen Grund (Fehler) meldet. Dieser nimmt die Schnittstellennamen als Kommandozeilenparameter; es zählt keine Schnittstellen.

%Vor%

Fragen?

    
Nominal Animal 10.01.2013, 20:30
quelle
4

(1) getifaddrs ()

>

(2) if_indextoname () , if_nameindex () , if_nametoindex ()

(3) Ich bin mir nicht sicher, aber vielleicht können Sie es über ioctl () und einer der SIOCGIF* -Parameter oder von /proc .

    
Duck 10.01.2013 19:41
quelle
2

Der folgende Link erklärt die Funktion getifaddrs mit einem Arbeitsbeispiel

getifaddrs ()

    
Davide Berra 10.01.2013 19:55
quelle
1
%Vor%

Dieser Befehl listet alle Details zu eth1 auf, einschließlich Geschwindigkeit, Duplex, Port ...

Sie können popen () verwenden, um die Ausgabe zu erhalten und sie zuzuordnen.

  

POPEN (3) Linux-Programmierhandbuch
  POPEN (3)

     

NAME          popen, pclose - pipe stream zu oder von einem Prozess

     

SYNOPSIS          #include

%Vor%
    
george 10.01.2013 18:12
quelle

Tags und Links