linux 下获取当前网络连接状态

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

注:第一种方法适用于2.6内核以后的版本,第二中方法适用于2.4及以前的版本,2.4及之前的版本没有/sys/class/net/%s/carrier这个目录


阅读全文
0 0
原创粉丝点击