Wie kann ich programmtechnisch ermitteln Sie die IP-Adresse/Netzmaske/gateway konfiguriert für einen bestimmten Netzwerk-Gerät in Linux?
Ich würde gerne schreiben ein Stück code, die überprüft, für die jedes Netzwerkgerät (z.B. eth0, lo, master-Geräte) einige Statistik-und Konfigurations-Daten über das Gerät.
Ich könnte die Statistik-Daten (und ein Großteil der Konfiguration, Daten) in /sys/class/net/..., allerdings, ich konnte nicht finden, dass jede C/C++ - API oder eine Eintrag im procfs/sysfs Auflistung der inet-Adresse, Netzmaske und gateway.
Einige alternativen, die ich geprüft:
- Parsen der Ausgabe von ifconfig/route/einige andere Dienstprogramme: ich will nicht zu starten, ein subprocess jedes mal, wenn ich brauche zu tun, die Inspektion.
- Parsen von /etc/sysconfig/network-scripts/: wird mir nur die start-up-Konfiguration, und nicht den aktuellen Stand.
Auch, da dieser code soll für ein Produkt in meinem Arbeitsplatz, wo jede externe Bibliothek wird geprüft, gründlich (was bedeutet, es wird mich für immer hinzufügen, externe Bibliothek) ich habe lieber Lösungen, die darauf angewiesen sind native Linux-API und keine externen Bibliotheken.
Dank!
- Als keine der Antworten deckt, wie man die gateway(s). Die Antwort finden Sie hier: stackoverflow.com/a/28322370/694576
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist sicher mit eine struct ifreq und ioctl () - Aufrufe kannst du dir alle interface-Informationen:
Mann Seite hier Ifreq manpage
Schnell Bearbeiten, diese Funktion erfordert, dass die Schnittstelle zugewiesen wurde, bevor Sie aufgerufen wird, etwa so:
Um sicherzustellen, Sie haben alloziert den Speicher erste, dann rufen Sie wie so
getifaddrs()
call ( kernel.org/doc/man-pages/online/pages/man3/getifaddrs.3.html ) ist nun der bevorzugte Weg, dies zu tun (zB. es unterstützt IPv6-Adressen).Befehl netstat durch strace (zufällig auf einer Linux-box), zeigt die folgende Sequenz von anrufen statt:
So, das "Geheimnis" zu sein scheint, einen socket zu erstellen, dann machen Sie eine Reihe von
ioctl()
Anrufe Zugriff auf die aktuellen Informationen.Werfen Sie einen Blick auf
/usr/include/ifaddrs.h
. Es ist eine GNU-spezifische API für diese.