LinuxでNICとケーブルの接続状態を検出


セットトップボックスのネットワーク接続の1つは、ネットワークカードとネットワークケーブルが接続されているかどうかを検出することです.ネットワークケーブルが接続されていない場合、ブラウザでエラーページを開き、ネットワークケーブルが接続されていないことを示します.では、ネットワークカードとネットワークケーブルが接続されているかどうかを検出します.
一、 ioctl socket SIOCETHTOOL
[cpp] view plain copy
  1. "font-size:18px;">#include  
  2. #include  
  3. #include  
  4.   
  5. #include   
  6. #include   
  7. #include   
  8.   
  9. #include   
  10. #include   
  11. #include   
  12. #include   
  13. #include   
  14.   
  15. int get_netlink_status(constchar *if_name);  
  16.   
  17. int main()  
  18. {  
  19.     if(getuid()!= 0)  
  20.     {  
  21.         fprintf(stderr,"Netlink Status Check Need Root Power.
    "
    );  
  22.         return 1;  
  23.     }  
  24.       
  25.     printf("Net link status: %d
    "
    , get_netlink_status("eth0"));  
  26.   
  27.     return 0;  
  28. }  
  29.   
  30. // if_name like "ath0", "eth0". Notice: call this function  
  31. // need root privilege.  
  32. // return value:  
  33. // -1 -- error , details can check errno  
  34. // 1 -- interface link up  
  35. // 0 -- interface link down.  
  36. int get_netlink_status(constchar *if_name)  
  37. {  
  38.     int skfd;  
  39.     struct ifreq ifr;  
  40.     struct ethtool_value edata;  
  41.   
  42.     edata.cmd = ETHTOOL_GLINK;  
  43.     edata.data = 0;  
  44.   
  45.     memset(&ifr, 0,sizeof(ifr));  
  46.     strncpy(ifr.ifr_name, if_name,sizeof(ifr.ifr_name)- 1);  
  47.     ifr.ifr_data =(char *) &edata;  
  48.   
  49.     if (( skfd= socket(AF_INET, SOCK_DGRAM, 0 )) 
  50.         return -1;  
  51.   
  52.     if(ioctl( skfd, SIOCETHTOOL,&ifr ) == -1)  
  53.     {  
  54.         close(skfd);  
  55.         return -1;  
  56.     }  
  57.   
  58.     close(skfd);  
  59.     return edata.data;  
  60.   
  61. }  

: ifconfigl : # ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:25:35:68:CC:D6  
          inet addr:192.168.1.168  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::215:c5ff:fe18:ccd6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:130722 errors:0 dropped:0 overruns:0 frame:0
          TX packets:112560 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:104371099 (99.5 MiB)  TX bytes:20518584 (19.5 MiB)
          Interrupt:16 
RUNNING , RUNNING 。

    linux popen/pclose C shell , C shell :

[cpp] view plain copy
#include   

  • #include   

  • #include   
  • #include   

  •   
  • int GetNetStat( )  

  • {  
  •     char    buffer[BUFSIZ];  

  •     FILE    *read_fp;  
  •     int        chars_read;  

  •     int        ret;  
  •      

  •     memset( buffer, 0, BUFSIZ );  
  •     read_fp = popen("ifconfig eth0 | grep RUNNING", "r");  

  •     if ( read_fp != NULL )  
  •     {  

  •         chars_read = fread(buffer, sizeof(char), BUFSIZ-1, read_fp);  
  •         if (chars_read > 0)  

  •         {  
  •             ret = 1;  

  •         }  
  •         else  

  •         {  
  •             ret = -1;  

  •         }  
  •         pclose(read_fp);  

  •     }  
  •     else  

  •     {  
  •         ret = -1;  

  •     }  
  •   

  •     return ret;  
  • }  

  •   
  •   

  • int main()  
  • {  

  •     int i=0;  
  •     i = GetNetStat();  

  •     printf( "NetStat = %d", i );  
  •     return 0;  

  • }