2010-05-20 8 views
9

Piszę aplikację, która zgłasza atrybuty urządzeń sieciowych na komputerze lokalnym. Potrzebuję adresu mac, mtu, prędkości łącza i kilku innych. Używam udev do tego. Dowiedziałem się już, jak zdobyć adres mac i mtu, ale nie wiem, jak uzyskać prędkość łącza. Mogę dostać to z ethtoolem z terminalu, ale potrzebuję sposobu, aby go programowo.Pobierz programowo prędkość łącza?

Czy ktoś wie, jak mogę uzyskać atrybut prędkości łącza dla udev lub innej biblioteki?

+0

Z udev? Jak to się udało? –

+0

Używanie wywołania 'udev_device_get_sysattr_value' z atrybutami" address "dla adresu Mac i" mtu "dla MTU. – StackedCrooked

Odpowiedz

24

Musisz użyć wywołania ioctl (SIOCETHTOOL). Jest ładne wywołanie introduction to ioctl/SIOCETHTOOL na LinuxJournal, a poniższy kod (który nie ma być przykładem dobrych praktyk C!) Powinien pokazać ci, jak go użyć, aby uzyskać prędkość.

#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

Dzięki! Przetestuję to jutro. (W rzeczywistości zhakowałem razem działające rozwiązanie, używając fragmentów kodu z kodu źródłowego ethtool. Jest bardzo podobny do tego.) – StackedCrooked

+0

Daje to błąd "Operacja niedozwolona", gdy jest uruchomiony jako nieuprzywilejowany używany na RHEL 5/6. Czy istnieje sposób na uzyskanie tych informacji bez konieczności uzyskiwania uprawnień administratora? –

+0

Powinieneś użyć ethtool_cmd_speed (& edata), aby uzyskać szybkość reakcji z edata, ponieważ jest tu kilka wysokich bitów, które zignorujesz tutaj. – MappaM