linux 检测网线拨出

来源:互联网 发布:动态最优化应用 编辑:程序博客网 时间:2024/05/01 10:47

link_stat.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <sys/ioctl.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <linux/if.h> 
#include <linux/sockios.h> 
#include <linux/ethtool.h> 
int get_netlink_status(const char *if_name); 
int main() 

if(getuid() != 0) 

fprintf(stderr, "Netlink Status Check Need Root Power.\n"); 
return 1; 

printf("Net link status: %d\n", get_netlink_status("eth0")); 
return 0; 

// if_name like "ath0", "eth0". Notice: call this function 
// need root privilege. 
// return value: 
// -1 -- error , details can check errno 
// 1 -- interface link up 
// 0 -- interface link down. 
int get_netlink_status(const char *if_name) 

int skfd; 
struct ifreq ifr; 
struct ethtool_value edata; 
edata.cmd = ETHTOOL_GLINK; 
edata.data = 0; 
memset(&ifr, 0, sizeof(ifr)); 
strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name) - 1); 
ifr.ifr_data = (char *) &edata; 
if (( skfd = socket( AF_INET, SOCK_DGRAM, 0 )) < 0) 
return -1; 
if(ioctl( skfd, SIOCETHTOOL, &ifr ) == -1) 

close(skfd); 
return -1; 

close(skfd); 
return edata.data; 
}

-----------------------------------------------------------

# 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不在了。 
我的目的是用C语言来实现程序,而linux系统提供了popen/pclose进程管道让C和shell很方便的交互,不过使用的时候要注意设置权限,以免造成安全隐患。废话不多说,看下面C代码结合shell命令检测网卡与网线连通状况: 
netstat.c

#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
/********************************************************************** 
* 函数名称: GetNetStat 
* 功能描述: 检测网络链接是否断开 
* 输入参数: 
* 输出参数: 无 
* 返 回 值: 正常链接1,断开返回-1 
* 其它说明: 本程序需要超级用户权限才能成功调用ifconfig命令 
* 修改日期 版本号 修改人 修改内容 
* --------------------------------------------------------------------- 
* 2010/04/02 V1.0 eden_mgqw 
***********************************************************************/ 
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( "\nNetStat = %d\n", i ); 
return 0; 
}

转载地址:http://www.cnblogs.com/cute/archive/2011/09/20/2182289.html

#include <ctype.h>;#include <err.h>;#include <errno.h>;#include <stdio.h>;#include <stdlib.h>;#include <string.h>;#include <unistd.h>;#include <sys/ioctl.h>;#include <sys/socket.h>;#include <net/if.h>;#include <net/if_types.h>;#include <net/if_media.h>;intmain(int argc,char **argv) {       int s;        struct ifreq ifr;       struct ifmediareq ifmr;       int *media_list;       char name[IFNAMSIZ];              if(2 != argc){           printf("Usage:\ntest cardname(e.g: vr0)\n");           return 1;       }                  strncpy(name, argv[1], sizeof(name));              ifr.ifr_addr.sa_family = AF_INET;       strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));       if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)               err(1, "socket");       (void) memset(&ifmr, 0, sizeof(ifmr));       (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));       if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)               err(1, "SIOCGIFMEDIA");       if (ifmr.ifm_count == 0) {               warnx("%s: no media types?", name);               return;       }       media_list = (int *)malloc(ifmr.ifm_count * sizeof(int));       if (media_list == NULL)               err(1, "malloc");       ifmr.ifm_ulist = media_list;       if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0)               err(1, "SIOCGIFMEDIA");       if (ifmr.ifm_status & IFM_AVALID) {               printf("\tstatus: ");               switch (IFM_TYPE(ifmr.ifm_active)) {               case IFM_ETHER:                       if (ifmr.ifm_status & IFM_ACTIVE)                               printf("active");                       else                               printf("no carrier");                       break;               case IFM_FDDI:               case IFM_TOKEN:                       if (ifmr.ifm_status & IFM_ACTIVE)                               printf("inserted");                       else                               printf("no ring");                       break;               case IFM_ATM:                       if (ifmr.ifm_status & IFM_ACTIVE)                               printf("active");                       else                               printf("no carrier");                       break;               case IFM_IEEE80211:                       if (ifmr.ifm_status & IFM_ACTIVE)                               printf("associated");                       else                               printf("no carrier");                       break;               }               putchar('\n');       }       free(media_list);       return 0; }


#include <sys/types.h>;  #include <sys/socket.h>;  #include <sys/ioctl.h>;  #include <net/if.h>;  #include <linux/sockios.h>;  #include <linux/types.h>;   struct mii_data {     __u16   phy_id;     __u16   reg_num;     __u16   val_in;     __u16   val_out;  };   int main()  {     int skfd;     struct ifreq ifr;     struct mii_data *mii;      if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {         perror("socket");         exit(1);     }      strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);     ifr.ifr_name[IFNAMSIZ-1] = 0;      if (ioctl(skfd, SIOCGMIIPHY, &ifr) < 0) {         perror("ioctl");         exit(1);     }      mii = (struct mii_data *)&ifr.ifr_data;     mii->;reg_num = 0x01;      if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0) {         perror("ioctl");         exit(1);     }     if (mii->;val_out & 0x0004)         puts("link ok");     else         puts("no link");      close(skfd);      return 0;  } 

转载地址:http://bbs.chinaunix.net/thread-618079-1-1.html

0 0
原创粉丝点击