Linux下检测网卡与网线连接状态,使用ioctl向socket发送SIOCETHTOOL命令字

时间:2021-01-13 17:24:14
在写一个wifi模块时,要检测网卡与网线的连接状态,在网上找了代码,发现很多都是有这种方式,但是返现代码运行时返回的都是失败!麻烦大家看看!

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include  <fcntl.h>
#include  <string.h>
#include  <sys/ioctl.h>
#include  <sys/socket.h>
#include  <linux/if.h>
#include  <unistd.h>
#include  <netinet/in.h>
#include  <sys/socket.h>
#include <netdb.h> 
#include <errno.h> 
#include <netinet/ip.h> 
#include <arpa/inet.h> 
#include <netinet/ip_icmp.h> 
#include <linux/if_ether.h> 
#include  <linux/sockios.h>
#include  <linux/ethtool.h>
static int get_netlink_status(const char *if_name)
{
    int skfd;
    struct ifreq ifr;
    struct ethtool_value edata;
    memset(&ifr,0,sizeof(ifr));
    edata.cmd=ETHTOOL_GLINK;
    edata.data=0;
    strncpy(ifr.ifr_name,if_name,sizeof(ifr.ifr_name));
    ifr.ifr_data=(char*)&edata;
    if((skfd=socket(AF_INET,SOCK_DGRAM,0)<0))
    {
        printf("get_netlink_status() socketerr skfd=%d strerror(errno)=%s\n",skfd,strerror(errno));
        return -1;
    }
#if 0
    if(ioctl(skfd,SIOCGIFFLAGS,&ifr)==-1)
#endif
    if(ioctl(skfd,SIOCETHTOOL,&ifr)==-1)
    {
        printf("Error=%s\n",strerror(errno));
        printf("get_netlink_status() ioctl err skfd=%d\n",skfd);
        close(skfd);
        return -1;
    }
    close(skfd);
    return edata.data;
}
int main()
{
    printf("eth0_data=%d\n",get_netlink_status("eth"));
    printf("lo=%d\n",get_netlink_status("lo"));
    printf("virbr0=%d\n",get_netlink_status("virbr0"));
    return 0;
}

 打印结果为什么是这个:明明eth0是连接状态了。代码是在root用户下的虚拟机中测试的,跟这个有关系么?
get_netlink_status() ioctl err skfd=0
eth0_data=-1
lo=1
virbr0=1

3 个解决方案

#1


虚拟机和实体机总该有区别,否则就不叫虚拟机了。
Linux下检测网卡与网线连接状态,使用ioctl向socket发送SIOCETHTOOL命令字纯打酱油的路过……

#2


    printf("eth0_data=%d\n",get_netlink_status("eth 0"));
确定没有少0?

#3


引用 2 楼 ForestDB 的回复:
    printf("eth0_data=%d\n",get_netlink_status("eth 0"));
确定没有少0?
加了也是一样的!!

#1


虚拟机和实体机总该有区别,否则就不叫虚拟机了。
Linux下检测网卡与网线连接状态,使用ioctl向socket发送SIOCETHTOOL命令字纯打酱油的路过……

#2


    printf("eth0_data=%d\n",get_netlink_status("eth 0"));
确定没有少0?

#3


引用 2 楼 ForestDB 的回复:
    printf("eth0_data=%d\n",get_netlink_status("eth 0"));
确定没有少0?
加了也是一样的!!