Wie man die NIC-details aus einem C-Programm?
Ich möchte die folgenden Angaben für alle NICs an meinem computer:
1) Interface-name (zB. eth0)
2) Nummer der Schnittstelle (wie in Windows), wenn so etwas existiert in Linux
3) NIC-Bandbreite und Modus (zB. 1Gb/s full-duplex)
- mit C-code zu bekommen, gleiche info wie ifconfig, auch chekcout netdevice
- Es muss Ihnen nicht sagen, 2 und 3.
- Its a beginnen, bis Sie eine Antwort bekommen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
getifaddrs()
/freeifaddrs()
erhalten Sie eine verlinkte Liste aller Schnittstellen, dannioctl(fd, SIOCGIFINDEX, struct ifreq *)
zu erhalten, den interface index für jeden. Da die Schnittstellen aufeinander sind und immer angezeigt (unabhängig davon, ob Sie (aktiv) oder nicht), wähle ich aufzählen, und Sie mit einer Schleife überioctl(fd, SIOCGIFNAME, struct ifreq *)
statt. In allen Fällenfd
ist einAF_INET
Buchse.Erhalten Sie die duplex und Geschwindigkeit der Schnittstelle, die Sie verwenden müssen, die
ioctl(fd, SIOCETHTOOL, struct ifreq *)
mit derifr_data
deutete auf einestruct ethtool_cmd
mitcmd = ETHTOOL_GSET
.Den ioctls sollte -1 zurückgeben, wenn Sie fehlschlagen und ein nicht negativer Wert (null, glaube ich), wenn Erfolg.
Hier ist ein Beispiel-Programm:
Wenn Sie speichern, wie Sie oben
iflist.c
, können Sie es kompilieren mitZu sehen, die Verwendung, die führen
iflist -h
. Um eine Liste aller Schnittstellen, führen Sie es ohne Parameter:Oben wird die Verwendung der enumeration-Methode, die ich beschrieben. Liste nur bestimmte Schnittstellen, führen Sie die Benennung der Schnittstellen:
Duplex und speed ist nur für ethernet-Schnittstellen, natürlich.
Bearbeitet, um hinzufügen:
Wenn das obige Programm liefert nicht die Bandbreite und den Modus für eine Schnittstelle, hier ist eine vereinfachte version, die Berichte der genaue Grund (Fehler). Das braucht die interface-Namen als Kommandozeilen-Parameter; es nicht auflisten Schnittstellen.
Fragen?
SIOCETHTOOL
ioctl, die verwendet werden, um die Betriebsart und die Bandbreite. Welche Schnittstellen haben Sie auf diesen Maschinen? Infiniband? Tutethtool eth0
Ausbeute der Bandbreite und Modus auf diese?eth0: SIOCETHTOOL ioctl: Operation not permitted.
wenn ich es als nicht-root-Benutzer. Dies ist, da auf einigen Systemen nur root erlaubt ist, um eine solche detaillierte Informationen über die Schnittstellen. Sie können überprüfen, ob dies auf Ihr system zutrifft, auch, indem Sie das Beispiel ausführen von code als root (mitsu
odersudo
).ethtool
noch? Bitte beachten Sie, dass beispielsweise die virtuellen Netzwerk-Schnittstellen nicht wirklich Bandbreite oder Modus, da Sie keinen Sinn machen für eine virtuelle Schnittstelle. Auch für andere virtuelle und nicht-ethernet-Geräten wie loopback.(1) getifaddrs()
(2) if_indextoname(), if_nameindex(), if_nametoindex()
(3) ich bin mir nicht sicher über diese ein, aber Sie könnten in der Lage sein, um es durch ioctl () - und einer der
SIOCGIF*
Parameter oder von/proc
.den folgenden link, erklären die
getifaddrs
Funktion mit einem Beispiel arbeitengetifaddrs()
dieser Befehl listet alle details über eth1 einschließlich Geschwindigkeit, duplex, port...
können Sie popen (), um die Ausgabe und Karte.