2010-07-09 15 views
16

Ich möchte feststellen, ob eine Netzwerkkarte aktiviert, aktiviert und eingesteckt ist. Grundsätzlich möchte ich wissen, ob die Netzwerkkarte funktioniert. Ich benötige diese Informationen von einem C++ - Programm und möchte eine Fehlermeldung anzeigen, wenn das Netzwerk nicht ordnungsgemäß funktioniert. Wenn möglich, möchte ich vermeiden, Shell-Befehle zu verwenden, um diese Informationen zu bestimmen.Unter Linux: Wie kann ich programmgesteuert feststellen, ob eine NIC-Schnittstelle aktiviert und angeschlossen ist?

+1

Wenn Sie nur feststellen möchten, ob die Netzwerkkarte "up" ist, verwenden Sie 'ioctl()' mit 'SIOCGIFFLAGS', um direkt den booleschen Status zu erhalten, siehe http://stackoverflow.com/questions/15723061/how-to-check-if -interface-is-up –

Antwort

16

Sie können /sys/class/net/eth0/operstate betrachten, wo eth0 Ihre Schnittstelle ist, um zu sehen, ob es oben ist.

Betrachten Sie /sys/class/net/eth0/carrier, um zu sehen, ob es einen Träger gibt.

Obwohl ich denke, Ausführung ifconfig und Freunde geben Ihnen mehr Kompatibilität zu * BSDs.

+0

Gibt es etwas ähnlich Elegantes für ältere Kernel? Auf meiner alten CentOS 4-Box habe ich mit Kernel 2.6.9 keine "operate" -Datei unter/sys/class/net/eth? – Matt

+0

Wissen Sie, wie Sie den Linkstatus überprüfen? Gibt es dafür eine Datei? Wie bei der Verwendung von ethletol eth0 zeigt die Ausgabe an, dass der Link erkannt wurde: YES – user1527227

+0

@EFraim Ich habe gerade verifiziert, dass dies auf meinem 2.6.31 nicht richtig funktioniert.Es scheint, dass es für einen Zugangspunkt nicht verfügbar ist, bis jemand nicht verbunden ist, während ifconfig zeigt, dass es oben ist. Das ist eine sehr große Unterscheidung. Ich kann das nicht sofort mit einem neuen Kernel überprüfen. Mit anderen Worten, Flagge zeigt sich, Träger 0, operate runter. – tothphu

4

Denken Sie daran, auf Linux "alles" ist eine Datei.

Der beste Weg wäre die Verwendung des freigegebenen Kernels < -> Userspace-Kommunikation, nämlich sysfs, montiert unter . Netzwerkgeräte an /sys/class/net verknüpft

Wenn Sie die ioctl Schnittstelle verwenden, schauen man netdevice

1

Wie beurteilen Sie die Netzwerkkarte identifizieren möchten? Sie können versuchen, einen Blick auf /etc/udev/rules.d/70-persistent-net.rules werfen, die Hardware-MAC-Adressen in nette Namen (wie eth0) abbildet.

Dann, wenn Sie die schöneren Namen haben, können Sie Dinge wie ethtool eth0 ausführen, um festzustellen, ob es [physisch] ist verbunden (letzte Zeile), ifconfig eth0, um zu bestimmen, ob es (suchen ist up „UP BROADCAST ...“), und wenn es eine IP-Adresse hat.

Ich bin bereit zu erraten, es gibt automatische Bibliotheken für diese obwohl; Hast du dich umgesehen? Ich bin mir nicht sicher, ob Code in NetworkManager leicht zugänglich ist, aber das sollte ein guter erster Platz sein, um zu schauen.

1

Durch die Ausgabe von getifaddrs können Sie die Verbindungsschicht für die MAC-Adresse verwenden, um einen Adapter zu identifizieren und das ifa_flags für IFF_UP zu überprüfen. Verwenden Sie AF_NETLINK für Benachrichtigungen über Schnittstellenänderungen.

4
  1. offen AF_NETLINK Buchse
  2. binden sie an sockaddr_nl mit nl_groups = RTMGRP_LINK
  3. Nachrichtens RTM_GETLINK
  4. make Umfrage/epoll auf Sockel auf Kernel RTM_NEWLINK und RTM_DELLINK Nachrichten
  5. zu lesen, werden Sie anfänglichen Schnittstellen Liste erhalten und seine Änderungen in der Zukunft
Verwandte Themen