4

我想知道是否有一种更紧凑的方法来查找 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。

提前致谢!

4

2 回答 2

0

这只能解决一半的问题,但是使用库 libpcap,您可以打开一个实时 pcap_t,然后调用 pcap_datalink。这将为您提供链接类型。(DLT_IEEE802_11、DLT_EN10MB 等)

于 2012-06-01T11:47:11.607 回答
0

要获取链接类型(以太网、802.11 等),您可以使用SIOCGIFHWADDRioctl。ioctl 返回 中的值之一(在中ARPHRD_定义net/if_arp.h)。有关详细信息,请参阅man netdevice(7)sa_familystruct sockaddr

看一个例子(未测试):

/**
 * 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;
}

要获得链接速度,您需要SIOCETHTOOLioctl,例如此处讨论的内容。

于 2017-11-23T11:12:43.973 回答