Comment puis-je rechercher par programmation de l'adresse IP/masque/passerelle configurée pour un périphérique réseau sous Linux?
Je voudrais écrire un morceau de code qui vérifie, pour chaque périphérique réseau (par exemple, eth0, lo, maître périphériques) quelques statistiques et les données de configuration sur le périphérique.
J'ai pu retrouver les données de la statistique de (et la plupart des données de configuration dans /sys/class/net/... cependant, je ne pouvais pas trouver toutes les API C/C++ ou toute entrée dans procfs/sysfs inscription de l'inet addr, le masque réseau et la passerelle.
Quelques solutions de rechange que j'ai vérifié:
- l'analyse de la sortie de ifconfig/route/quelques autres utilitaires: je ne veux pas commencer un sous-processus à chaque fois que j'ai besoin pour faire l'inspection.
- analyse /etc/sysconfig/network-scripts/: me donnera seulement le démarrage de la configuration, et pas l'état actuel.
Aussi, étant donné que ce code est prévu pour un produit dans mon lieu de travail, où chaque bibliothèque externe est inspecté à fond (ce qui signifie qu'il va me prendre une éternité pour ajouter toute une bibliothèque externe) je préfère les solutions qui s'appuient sur Linux API native et non des bibliothèques externes.
Merci!
OriginalL'auteur Oren S | 2010-06-07
Vous devez vous connecter pour publier un commentaire.
Il est sûr à l'aide d'une structure de ifreq et appels ioctl (), vous pouvez saisir toutes les informations d'interface:
Page de Man est ici Ifreq page de manuel
D'édition rapide, cette fonction nécessite que l'interface a été attribuée avant elle est appelée, comme suit:
S'assurer que vous avez la mémoire allouée premier, puis appeler comme
Le
getifaddrs()
appel ( kernel.org/doc/man-pages/online/pages/man3/getifaddrs.3.html ) est maintenant la meilleure façon de le faire (par exemple. il prend en charge les adresses IPv6).OriginalL'auteur Bella
L'exécution de la commande netstat par strace (au hasard, Linux), révèle la séquence suivante d'appels:
Donc, le "secret" semble être de créer une socket, puis faire un tas de
ioctl()
appels d'accéder à de l'information actuelle.OriginalL'auteur unwind
Prendre un coup d'oeil à
/usr/include/ifaddrs.h
. Il y a un GNU API spécifique pour cela.OriginalL'auteur user3258797