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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言+shell实现linux网卡状态检测

    本文实例为大家分享了C语言+shell实现linux网卡状态检测的具体代码,供大家参考,具体内容如下 不解释,直接上代码 要求linux环境具备grep和awk(awk可选) #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int get_if_status(char *if_name) { char buffer[BUFSIZ]; char cmd

  • C语言实现linux网卡连接检测的方法

    本文实例为大家分享了C语言实现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 <

  • C语言实现linux网卡检测精简版

    本文实例为大家分享了C语言实现linux网卡检测的精简代码,供大家参考,具体内容如下 万能的网络,通过getifaddrs可以大大减少编码量,获得 C语言实现linux网卡检测-改进版 同样的效果. #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <linux/

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

    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&

  • 用C/C++实现linux下检测网络接口状态

    本文实例为大家分享了使用C/C++实现linux下检测网络接口状态,供大家参考,具体内容如下 要写个检测网络接口链接状态的东西,又不喜欢不断的ping别的地址,也不想调用其他命令行工具来做这个,于是在google了n多内容未果之后,搜到个检测工具的源代码. 以下代码在fedora 9 / CentOS 5.2下调试通过:) #include <sys/types.h> #include <string.h> #include <stdlib.h> #include &l

  • php在linux下检测mysql同步状态的方法

    本文实例讲述了php在linux下检测mysql同步状态的方法.分享给大家供大家参考.具体分析如下: 这里通过两个实例来介绍mysql同步状态检测实现方法.代码如下: 复制代码 代码如下: #!/bin/sh     #check MySQL_Slave Status  #crontab time 00:10  MYSQL_USER="root" MYSQL_PWD="123456" MYSQL_SLAVE_LOG="/tmp/check_mysql_sl

  • linux 网卡配置详解及实例

    linux网卡配置 DEVICE=物理设备名 IPADDR=IP地址 NETMASK=掩码值 NETWORK=网络地址 BROADCAST=广播地址 GATEWAY=网关地址 TYPE=Ethernet (网络类型) ONBOOT=[yes|no](引导时是否激活设备) USERCTL=[yes|no](非root用户是否可以控制该设备) PEERDNS=[yes|no] (如果通过 DHCP 获取 IP ,是否将 DNS 信息写入 /etc/resolv.conf (覆盖)) BOOTPROT

  • C语言实现Linux下的socket文件传输实例

    本文实例讲述了C语言实现Linux下的socket文件传输.分享给大家供大家参考.具体如下: server.c如下: //////////////////////////////////// //服务器代码 /////////////////////////////////// //本文件是服务器的代码 #include <netinet/in.h> // for sockaddr_in #include <sys/types.h> // for socket #include &

  • Go语言在Linux环境下输出彩色字符的方法

    Go语言要打印彩色字符与Linux终端输出彩色字符类似,以黑色背景高亮绿色字体为例: fmt.Printf("\n %c[1;40;32m%s%c[0m\n\n", 0x1B, "testPrintColor", 0x1B) 其中0x1B是标记,[开始定义颜色,1代表高亮,40代表黑色背景,32代表绿色前景,0代表恢复默认颜色.显示效果为: 下面代码遍历全部显示效果. package main import ( "fmt" ) func main

  • Linux学习之CentOS(二十九)--Linux网卡高级命令、IP别名及多网卡绑定的方法

    本篇随笔将详细讲解Linux系统的网卡高级命令.IP别名以及Linux下多网卡绑定的知识 一.网卡高级命令 在之前的一篇随笔里Linux学习之CentOS(九)--Linux系统的网络环境配置,详细讲解了Linux系统下的网络环境配置等知识,我们了解了一些关于网络配置的一些基本命令.在这里将补充一些Linux系统下有关网卡的一些高级命令. ①mii-tool 命令 mii-tool命令我们可以用来查看网卡状态信息,包括了以太网连接是否正常,使用的是哪种型号的网卡等等 [root@xiaoluo

随机推荐