2010-05-20 7 views
9

Ich schreibe eine Anwendung, die Attribute von Netzwerkgeräten auf dem lokalen Rechner meldet. Ich brauche die MAC-Adresse, MTU, Link-Geschwindigkeit und ein paar andere. Ich benutze dafür udev. Ich habe bereits herausgefunden, wie man die MAC-Adresse und MTU bekommt, aber nicht wie man die Verbindungsgeschwindigkeit erhält. Ich kann es mit ethtool vom Terminal bekommen, aber ich brauche einen Weg, um es programmatisch zu bekommen.Link-Geschwindigkeit programmgesteuert erhalten?

Weiß jemand, wie ich das Verbindungsgeschwindigkeitsattribut mit udev oder einer anderen Bibliothek erhalten kann?

+0

Mit udev? Wie hast du das geschafft? –

+0

Verwenden des Aufrufs 'udev_device_get_sysattr_value' mit den Attributen "Adresse" für die Mac-Adresse und "mtu" für die MTU. – StackedCrooked

Antwort

24

Sie müssen den ioctl() - Aufruf SIOCETHTOOL verwenden. Es gibt einen netten introduction to ioctl/SIOCETHTOOL Aufruf auf LinuxJournal, und der folgende Code (der nicht als Beispiel für gute C-Übungen gedacht ist!) Sollte Ihnen zeigen, wie Sie ihn verwenden können, um die Geschwindigkeit zu erreichen.

#include <stdio.h> 
#include <sys/socket.h> 
#include <sys/ioctl.h> 
#include <netinet/in.h> 
#include <linux/sockios.h> 
#include <linux/if.h> 
#include <linux/ethtool.h> 
#include <string.h> 
#include <stdlib.h> 

int main (int argc, char **argv) 
{ 
    int sock; 
    struct ifreq ifr; 
    struct ethtool_cmd edata; 
    int rc; 

    sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 
    if (sock < 0) { 
     perror("socket"); 
     exit(1); 
    } 

    strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name)); 
    ifr.ifr_data = &edata; 

    edata.cmd = ETHTOOL_GSET; 

    rc = ioctl(sock, SIOCETHTOOL, &ifr); 
    if (rc < 0) { 
     perror("ioctl"); 
     exit(1); 
    } 
    switch (ethtool_cmd_speed(&edata)) { 
     case SPEED_10: printf("10Mbps\n"); break; 
     case SPEED_100: printf("100Mbps\n"); break; 
     case SPEED_1000: printf("1Gbps\n"); break; 
     case SPEED_2500: printf("2.5Gbps\n"); break; 
     case SPEED_10000: printf("10Gbps\n"); break; 
     default: printf("Speed returned is %d\n", edata.speed); 
    } 

    return (0); 
} 
+0

Danke! Ich werde es morgen testen. (Ich habe tatsächlich eine funktionierende Lösung zusammengehackt, indem ich Code-Snippits aus 'ethtool's Quellcode verwendet habe. Das ist sehr ähnlich.) – StackedCrooked

+0

Dies ergibt einen" Operation nicht erlaubt "-Fehler beim Ausführen als nicht-privilegierte Anwendung auf RHEL 5/6. Gibt es eine Möglichkeit, diese Informationen ohne Rootzugriff zu erhalten? –

+0

Sie sollten ethtool_cmd_speed (& edata) verwenden, um eine Geschwindigkeitsantwort von edata zu erhalten, da einige hohe Bits hier ignoriert werden. – MappaM

Verwandte Themen