Sous Linux: comment puis-je déterminer par programme si une interface NIC est activée et connectée?
Je voulez savoir si une carte réseau est activée, le haut et branché. En gros, je veux savoir si la carte réseau fonctionne. J'ai besoin de cette information à partir d'un programme C++, et voudrais afficher un message d'erreur lorsque le réseau ne fonctionne pas correctement. Si possible, je voudrais éviter d'utiliser des commandes shell à déterminer cette information.
source d'informationauteur Dylan Klomparens
Vous devez vous connecter pour publier un commentaire.
Vous pouvez regarder
/sys/class/net/eth0/operstate
où eth0 est l'interface pour voir si elle est en place.Regarder
/sys/class/net/eth0/carrier
pour voir si il y a un transporteur.Bien que je suppose que l'exécution de
ifconfig
et amis vous donnera plus de compatibilité avec les *Bsd.Rappelez-vous, sur Linux "tout" est un fichier.
Le meilleur moyen serait d'utiliser le approuvés noyau<->utilisateur de la communication, à savoir
sysfs
est monté au/sys
. Les périphériques réseau sont liés à/sys/class/net
Si vous souhaitez utiliser le
ioctl
interface, regardezman netdevice
AF_NETLINK
socketsockaddr_nl
avecnl_groups = RTMGRP_LINK
RTM_GETLINK
à noyauRTM_NEWLINK
etRTM_DELLINK
messagesComment voulez-vous identifier la carte réseau? Vous pourriez essayer de prendre un coup d'oeil à
/etc/udev/rules.d/70-persistent-net.rules
qui cartes de le matériel des adresses MAC dans de jolies noms (comme eth0).Alors, quand vous avez le plus beau nom, vous pouvez exécuter des choses comme
ethtool eth0
pour déterminer si elle est [physiquement] connecté (dernière ligne),ifconfig eth0
pour déterminer si elle est en place (rechercher "en HAUT de DIFFUSION..."), et si il a une adresse IP.Je suis prêt à le deviner il ya automatique des bibliothèques pour ce bien; avez-vous regardé autour? Je ne suis pas sûr si il est facilement accessible de code dans NetworkManager, mais c'est un bon endroit pour chercher.
Courir à travers la sortie de
getifaddrs
vous pouvez utiliser la couche de liaison de l'adresse MAC pour identifier une carte et cochez laifa_flags
pour IFF_UP. UtilisationAF_NETLINK
pour les notifications concernant les modifications de l'interface.