2010-05-20 18 views
9

Yerel makinede ağ aygıtlarının niteliklerini bildiren bir uygulama yazıyorum. Mac adresine, mtu, bağlantı hızına ve birkaç tanesine ihtiyacım var. Bunun için udev kullanıyorum. Mac adresini ve mtu'yı nasıl alacağımı çoktan öğrendim, ancak bağlantı hızını nasıl alacağımı değil. Terminalden ethtool ile alabilirim, ama programlı olarak almanın bir yoluna ihtiyacım var.Bağlantı hızını programlı olarak alın?

Bağlantı hızı özniteliğini udev veya başka bir kütüphaneyle nasıl alabileceğimi bilen var mı?

+0

Udev ile? Bunu nasıl yaptın? –

+0

"udev_device_get_sysattr_value" çağrısını Mac adresi için "adres" ve MTU için "mtu" özelliklerini kullanarak kullanın. – StackedCrooked

cevap

24

SIOCETHTOOL ioctl() çağrısını kullanmanız gerekir. LinuxJournal'da güzel bir introduction to ioctl/SIOCETHTOOL çağrısı var ve aşağıdaki kod (iyi C uygulamalarının bir örneği olmayı amaçlamıyor!) Hızı elde etmek için onu nasıl kullanacağınızı göstermelidir.

#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

Teşekkürler! Yarın test edeceğim. (Ben aslında ethtool'un kaynak kodundan kod parçalarını kullanarak çalışan bir çözümü hackledim. Buna çok benzer.) – StackedCrooked

+0

Bu, RHEL 5'de kullanılan ayrıcalıklı olmayan bir özellik olarak çalışırken "Çalışmaya izin verilmiyor" hatası veriyor/6. Bu bilgiye root erişimi gerekmeden ulaşmanın bir yolu var mı? –

+0

Burada göz ardı ettiğiniz bazı yüksek bitler olduğundan, edata'dan hız yanıtı almak için ethtool_cmd_speed (& edata) kullanmalısınız. – MappaM