Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1372401
  • 博文数量: 198
  • 博客积分: 1629
  • 博客等级: 上尉
  • 技术积分: 2743
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-01 15:41
文章分类
文章存档

2023年(6)

2022年(20)

2021年(8)

2020年(3)

2018年(17)

2017年(3)

2016年(3)

2015年(9)

2014年(13)

2013年(17)

2012年(77)

2011年(22)

分类: C/C++

2014-04-15 13:52:35


点击(此处)折叠或打开

  1. /*
  2.  * get net link
  3.  */
  4. #include <linux/sockios.h>
  5. #include <sys/socket.h>
  6. #include <sys/ioctl.h>
  7. #include <linux/if.h>
  8. #include <string.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <unistd.h>
  12.   
  13. #define ETHTOOL_GLINK 0x0000000a /* Get link status (ethtool_value) */
  14.   
  15. typedef enum { IFSTATUS_UP, IFSTATUS_DOWN, IFSTATUS_ERR } interface_status_t;
  16.   
  17. typedef signed int u32;
  18.   
  19. /* for passing single values */
  20. struct ethtool_value
  21. {
  22.     u32 cmd;
  23.     u32 data;
  24. };
  25.   
  26. interface_status_t interface_detect_beat_ethtool(int fd, char *iface)
  27. {
  28.     struct ifreq ifr;
  29.     struct ethtool_value edata;
  30.      
  31.     memset(&ifr, 0, sizeof(ifr));
  32.     strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name)-1);
  33.   
  34.     edata.cmd = ETHTOOL_GLINK;
  35.     ifr.ifr_data = (caddr_t) &edata;
  36.   
  37.     if (ioctl(fd, SIOCETHTOOL, &ifr) == -1)
  38.     {
  39.         perror("ETHTOOL_GLINK failed ");
  40.         return IFSTATUS_ERR;
  41.     }
  42.   
  43.     return edata.data ? IFSTATUS_UP : IFSTATUS_DOWN;
  44. }
  45.   
  46. int main (int argc, char *argv[])
  47. {
  48.     FILE *fp;
  49.     interface_status_t status;
  50.     char buf[512] = {'\0'};
  51.     char hw_name[10] = {'\0'};
  52.     char *token = NULL;
  53.     /*获取网卡名称*/
  54.     if ((fp = fopen("/proc/net/dev", "r")) != NULL)
  55.     {
  56.         while (fgets(buf, sizeof(buf), fp) != NULL)
  57.         {
  58.             if(strstr(buf, "eth") != NULL)
  59.             {
  60.                 token = strtok(buf, ":");
  61.                 while (*token == ' ') ++token;
  62.                 strncpy(hw_name, token, strlen(token));
  63.             }
  64.         }
  65.     }
  66.     fclose(fp);
  67. /*方法一:查看一个文件,相对简单*/
  68. #if 1
  69.     char carrier_path[512] = {'\0'};
  70.       
  71.     memset(buf, 0, sizeof(buf));
  72.     snprintf(carrier_path, sizeof(carrier_path), "/sys/class/net/%s/carrier", hw_name);
  73.     if ((fp = fopen(carrier_path, "r")) != NULL)
  74.     {
  75.         while (fgets(buf, sizeof(buf), fp) != NULL)
  76.         {
  77.             if (buf[0] == '0')
  78.             {
  79.                 status = IFSTATUS_DOWN;
  80.             }
  81.             else
  82.             {
  83.                 status = IFSTATUS_UP;
  84.             }
  85.         }
  86.     }
  87.     else
  88.     {
  89.         perror("Open carrier ");
  90.     }
  91.     fclose(fp);
  92. #endif
  93.  /*方法二:调用函数,有点复杂*/
  94. #if 0
  95.     int fd;
  96.       
  97.     if((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  98.     {
  99.         perror("socket ");
  100.         exit(0);
  101.     }
  102.     status = interface_detect_beat_ethtool(fd, hw_name);
  103.     close(fd);
  104. #endif
  105.   
  106.     switch (status)
  107.     {
  108.         case IFSTATUS_UP:
  109.             printf("%s : link up\n", hw_name);
  110.             break;
  111.           
  112.         case IFSTATUS_DOWN:
  113.             printf("%s : link down\n", hw_name);
  114.             break;
  115.           
  116.         default:
  117.             printf("Detect Error\n");
  118.             break;
  119.     }
  120.   
  121.     return 0;
  122. }

阅读(2169) | 评论(0) | 转发(0) |
0

上一篇:Linux启动过程分析

下一篇:Logo居中显示

给主人留下些什么吧!~~