获取网络连接类型并用C编程速度(Get network link type and speed pr

2019-09-17 14:02发布

我不知道是否有找到链接速度和类型在Linux的网络接口(无线,以太网),一个更紧凑的方式,而不是仅仅开放和读取/sys/class/net/eth0/type/sys/class/net/eth0/speed文件的例子。

如果没有,谁能告诉我哪里可以找到该号码/sys/class/net/eth0/type的回报,在这种网络类型对应?

编辑:这得更惨! 一些实验用的无线之后, /sys/class/net/wlan0/type的回报也是1,和/sys/class/net/wlan0/speed并不存在,我不得不采取从链路速度/sys/class/net/wlan0/wireless/link一些时间返回的速度是不正确的。 例如,在54Mbits卡有时会返回55。

提前致谢!

Answer 1:

这不仅解决了一半的问题,但与库libpcap的,你可以打开一个活pcap_t,然后调用pcap_datalink。 这会给你的链接类型。 (DLT_IEEE802_11,DLT_EN10MB等)

  • http://www.tcpdump.org/pcap3_man.html
  • http://www.manpagez.com/man/3/pcap_datalink/


Answer 2:

要获得链路类型(以太网,802.11等),您可以使用SIOCGIFHWADDR IOCTL。 所述IOCTL返回之一ARPHRD_值(定义在net/if_arp.h在) sa_family所述的struct sockaddr 。 见男子netdevice(7)了解更多详情。

看到一个例子(未测试):

/**
 * Get network interface link type
 * @param name the network interface name
 * @return <0 error code on error, the ARPHRD_ link type otherwise
 */
int get_link_type(const char* name)
{
    int rv;
    int fd;
    struct ifreq ifr;

    if (strlen(name) >= IFNAMSIZ) {
        fprintf(stderr, "Name '%s' is too long\n", name);
        return -ENAMETOOLONG;
    }
    strncpy(ifr.ifr_name, name, IFNAMSIZ);

    fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
    if (fd < 0)
        return fd;

    rv = ioctl(fd, SIOCGIFHWADDR, &ifr);
    close(fd);
    if (rv < 0)
        return rv;

    {
        char *type = "Unknown";
        switch (ifr.ifr_hwaddr.sa_family)
        {
        case ARPHRD_ETHER:  type = "Ethernet"; break;
        case ARPHRD_IEEE80211:  type = "802.11"; break;
        /* add more cases here */
        }
        printf("Link type is: %s\n", type);
    }

    return ifr.ifr_hwaddr.sa_family;
}

要获得链接的速度,你需要的SIOCETHTOOL IOCTL,例如讨论在这里 。



文章来源: Get network link type and speed programmatically in C