微信号:CyuyanAn

介绍:C语言C++;JAVA安卓系统软件编程,C语言编译器,C语言函数手册,C语言编程技巧,C语言视频教学,C语言考试,C语言软件开发设计,

C语言实现linux网卡检测改进版

2018-07-05 16:17 C语言JAVA软件编程设计

 C语言+shell 实现linux网卡状态检测  和 C语言实现linux网卡连接检测 2文的方法各有缺陷,比如有些系统执行ifconfig需要root权限,要不就不支持ioctl(fd, SIOCGMIIPHY, &ifr)这样的操作。以下给出了C语言实现linux网卡连接检测 的改进版实现与C语言+shell 实现linux网卡状态检测 同样的功能。


#include <stdlib.h>

#include <stdio.h>
#include <string.h>
#include <unistd.h>
   
   
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <linux/mii.h>
#include <linux/sockios.h>
#include <errno.h>
   
#include <ifaddrs.h>
#include <arpa/inet.h> 
   
#include <linux/ethtool.h>
   
int  cshell_netlink_status( char  *if_name)
{
  char   buffer[BUFSIZ];
  char   cmd[100];
  FILE   *read_fp;
  int     chars_read;
  int     ret =0;
   
  memset ( buffer, 0, BUFSIZ );
  memset ( cmd, 0, 100 );
  sprintf (cmd,  "ifconfig -a | grep %s" ,if_name);
  read_fp = popen(cmd,  "r" );
  if  ( read_fp != NULL )
  {
  chars_read =  fread (buffer,  sizeof ( char ), BUFSIZ-1, read_fp);
  pclose(read_fp);
   
  if  (chars_read > 0)
  {
   ret = 1;
  }
  else
  {
   fprintf (stderr,  "DEVICE_NONE\r\n" );
   return  0;
  }
  }
   
  if (ret == 1)
  {
  memset ( buffer, 0, BUFSIZ );
  memset ( cmd, 0, 100 );
  sprintf (cmd,  "ifconfig |grep %s" ,if_name);
  read_fp = popen(cmd,  "r" );
  if  ( read_fp != NULL )
  {
   chars_read =  fread (buffer,  sizeof ( char ), BUFSIZ-1, read_fp);
   pclose(read_fp);
   
   if  (chars_read > 0)
   {
   ret = 2;
   }
   else
   {
   fprintf (stderr,  "DEVICE_DOWN\r\n" );
   return  1;
   }
  }
  }
   
  if (ret == 2)
  {
  memset ( buffer, 0, BUFSIZ );
  memset ( cmd, 0, 100 );
  sprintf (cmd,  "ifconfig %s | grep RUNNING | awk '{print $3}'" ,if_name);
  read_fp = popen(cmd,  "r" );
  if  ( read_fp != NULL )
  {
    chars_read =  fread (buffer,  sizeof ( char ), BUFSIZ-1, read_fp);
    pclose(read_fp);
    
    if  (chars_read > 0)
    {
   fprintf (stderr,  "DEVICE_LINKED\r\n" );
   return  3;
    }
    else
    {
   fprintf (stderr,  "DEVICE_UNPLUGGED\r\n" );
   return  2;
    }
  }
  }
   
  return  -1;
}
   
   
int  c_netlink_status( const  char  *if_name )
{
  int  fd = -1; 
  struct  ifreq ifr; 
   
  struct  ifconf ifc; 
  struct  ifreq ifrs_buf[100]; 
  int  if_number =0;
  int  i;
   
   
  if  ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
  {
  fprintf (stderr,  "%s: socket error [%d] %s\r\n" ,if_name,  errno strerror ( errno ));
  close(fd);
  return  -1; 
  }
   
  ifc.ifc_len =  sizeof (ifrs_buf); 
  ifc.ifc_buf = (caddr_t)ifrs_buf; 
  if  (ioctl(fd, SIOCGIFCONF, ( char  *)&ifc) <0) 
  {
  fprintf (stderr,  "%s: ioctl SIOCGIFCONF error [%d] %s\r\n" ,if_name,  errno strerror ( errno ));
  close(fd);
  return  -1; 
  }
   
  if_number = ifc.ifc_len /  sizeof ( struct  ifreq);
  for (i=0; i< if_number; i++)
  {
  if ( strcmp (if_name,ifrs_buf[i].ifr_name ) == 0)
  {
   break ;
  }
  }
   
  if (i >= if_number)
  {
  close(fd);
  fprintf (stderr,  "DEVICE_NONE\r\n" );
  return  0;
  }
   
  bzero(&ifr,  sizeof (ifr));
  strncpy (ifr.ifr_name, if_name, IFNAMSIZ-1); 
  ifr.ifr_name[IFNAMSIZ-1] = 0; 
  if  (ioctl(fd, SIOCGIFFLAGS, ( char  *)&ifr) <0) 
  {
  fprintf (stderr,  "%s: ioctl SIOCGIFFLAGS error [%d] %s\r\n" ,if_name,  errno strerror ( errno ));
  close(fd);
  return  -1; 
  }
#if 1 
  if (!(ifr.ifr_flags & IFF_UP))
  {
  close(fd);
  fprintf (stderr,  "DEVICE_DOWN\r\n" );
  return  1;
  }
   
  if (!(ifr.ifr_flags & IFF_RUNNING))
  {
  close(fd);
  fprintf (stderr,  "DEVICE_UNPLUGGED\r\n" );
  return  2 ;
  }
   
  fprintf (stderr,  "DEVICE_LINKED\r\n" );
  return  3;
   
#else
{
  struct  ethtool_value edata;
  if (!(ifr.ifr_flags & IFF_UP) || !(ifr.ifr_flags & IFF_RUNNING))
  {
  close(fd);
  fprintf (stderr,  "%s: DOWN\r\n" ,if_name);
  return  1;
  }
  edata.cmd = ETHTOOL_GLINK;
  edata.data = 0;
  ifr.ifr_data = ( char  *) &edata;
  if (ioctl( fd, SIOCETHTOOL, &ifr ) < 0)
  {
  fprintf (stderr,  "%s: ioctl SIOCETHTOOL error [%d] %s\r\n" ,if_name,  errno strerror ( errno ));
  close(fd);
  return  -1; 
  }
   
  if (edata.data == 0)
  {
  fprintf (stderr,  "DEVICE_UNPLUGGED\r\n" );
  return  2; 
  }
  else
  {
  fprintf (stderr,  "DEVICE_LINKED\r\n" );
  return  3; 
  }
}
#endif
}
   
int  main( int  argc,  char * argv[])
{
  int  i=0;
  if (argc != 2)
  {
  fprintf (stderr,  "usage: %s <ethname>\r\n" , argv[0]);
  return  -1;
  }
   
  i = cshell_netlink_status(argv[1]);
   
  printf "cshell_netlink_status if_status = %d\n" , i );
   
  i = c_netlink_status(argv[1]);
  printf "c_netlink_status if_status = %d\n" , i );
   
  return  0;
}






 
C语言JAVA软件编程设计 更多文章 为什么我通知你看下C 语言进阶的这几个建议? 【干货分享】IT 行业的未来在哪里? 真实案例拆解:告诉你怎么掌握所有的编程语言 大牛给计算机专业学生的 7 个建议 一场皆大欢喜的程序员跳槽事件
猜您喜欢 VR技术将如何改变我们熟知的企业? 带你进入盗梦空间——自制一个梦境操控眼罩 2016大数据技术直通车免费公开课 other如何申请PAUSE 账号 PHP语言基础简单整理