C语言检测连接网卡状态

​ 有些客户程序里面的代码需要自己检测网卡状态,检查是否连接网线。需要提供函数给他们调用,检测网卡连接状态。

//在<linux/ethtool.h>头文件中存在结构体`ethtool_value`,用于存放网卡连接状态。
/* for passing single values */
struct ethtool_value {
        __u32   cmd;
        __u32   data; // 表示网卡连接状态。
};

// 在<linux/sockios.h> 中存在
#define SIOCETHTOOL 0x8946   /* Ethtool interface    */

​ 函数如下,获取网卡连接状态。

/**
* if_name 值如"eth0". 
* 返回值:
* -1 表示 error 
* 1 表示 eth0 link up
* 0 表示 eth0 link down.
*/
int get_netlink_status(const char *if_name)
{
  int skfd;
  struct ifreq ifr;
  struct ethtool_value edata; // 用于获取网卡状态
  edata.cmd = ETHTOOL_GLINK;
  edata.data = 0;//网卡link状态值,0表示down,1表示up
  memset(&ifr, 0, sizeof(ifr));
  strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name) - 1);
  ifr.ifr_data = (char *) &edata;
  if (( skfd = socket( AF_INET, SOCK_DGRAM, 0 )) == 0){
      return -1;
  }
    
  if(ioctl( skfd, SIOCETHTOOL, &ifr ) == -1){
    close(skfd);
    return -1;
  }
  close(skfd);
  return edata.data;
}

测试案例

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/if.h>

#include <linux/sockios.h>
#include <linux/ethtool.h>

/*获取网卡连接状态函数*/
int get_netlink_status(const char *if_name)
{
  int skfd;
  struct ifreq ifr;
  struct ethtool_value edata;
  edata.cmd = ETHTOOL_GLINK;
  edata.data = 0;
  memset(&ifr, 0, sizeof(ifr));
  strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name) - 1);
  ifr.ifr_data = (char *) &edata;
  if (( skfd = socket( AF_INET, SOCK_DGRAM, 0 )) == 0)
    return -1;
  if(ioctl( skfd, SIOCETHTOOL, &ifr ) == -1)
  {
    close(skfd);
    return -1;
  }
  close(skfd);
  return edata.data;
}

/*main */
int main(int argc, char* argv[])
{
 if(argc != 2) 
 {
       fprintf(stderr, "usage: %s <ethname>", argv[0]);
   return -1;
  }
  if(getuid() != 0)
  {
    fprintf(stderr, "请使用root权限.\n");
    return 1;
  }

  printf("Net link status: %s\n", get_netlink_status(argv[1]) == 1?"up":"down");
  return 0;
}

enp5s0f0接了网线,enp5s0f1没有接网线。
在这里插入图片描述

Logo

更多推荐