C语言实现linux网卡检测改进版
C语言+shell实现linux网卡状态检测 和 C语言实现linux网卡连接检测2文的方法各有缺陷,比如有些系统执行ifconfig需要root权限,要不就不支持ioctl(fd,SIOCGMIIPHY,&ifr)这样的操作。以下给出了C语言实现linux网卡连接检测的改进版实现与C语言+shell实现linux网卡状态检测同样的功能。
#include#include #include #include #include #include #include #include #include #include #include #include #include intcshell_netlink_status(char*if_name) { charbuffer[BUFSIZ]; charcmd[100]; FILE*read_fp; intchars_read; intret=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"); return0; } } 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"); return1; } } } if(ret==2) { memset(buffer,0,BUFSIZ); memset(cmd,0,100); sprintf(cmd,"ifconfig%s|grepRUNNING|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"); return3; } else { fprintf(stderr,"DEVICE_UNPLUGGED\r\n"); return2; } } } return-1; } intc_netlink_status(constchar*if_name) { intfd=-1; structifreqifr; structifconfifc; structifreqifrs_buf[100]; intif_number=0; inti; if((fd=socket(AF_INET,SOCK_DGRAM,0))<0) { fprintf(stderr,"%s:socketerror[%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:ioctlSIOCGIFCONFerror[%d]%s\r\n",if_name,errno,strerror(errno)); close(fd); return-1; } if_number=ifc.ifc_len/sizeof(structifreq); for(i=0;i =if_number) { close(fd); fprintf(stderr,"DEVICE_NONE\r\n"); return0; } 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:ioctlSIOCGIFFLAGSerror[%d]%s\r\n",if_name,errno,strerror(errno)); close(fd); return-1; } #if1 if(!(ifr.ifr_flags&IFF_UP)) { close(fd); fprintf(stderr,"DEVICE_DOWN\r\n"); return1; } if(!(ifr.ifr_flags&IFF_RUNNING)) { close(fd); fprintf(stderr,"DEVICE_UNPLUGGED\r\n"); return2; } fprintf(stderr,"DEVICE_LINKED\r\n"); return3; #else { structethtool_valueedata; if(!(ifr.ifr_flags&IFF_UP)||!(ifr.ifr_flags&IFF_RUNNING)) { close(fd); fprintf(stderr,"%s:DOWN\r\n",if_name); return1; } edata.cmd=ETHTOOL_GLINK; edata.data=0; ifr.ifr_data=(char*)&edata; if(ioctl(fd,SIOCETHTOOL,&ifr)<0) { fprintf(stderr,"%s:ioctlSIOCETHTOOLerror[%d]%s\r\n",if_name,errno,strerror(errno)); close(fd); return-1; } if(edata.data==0) { fprintf(stderr,"DEVICE_UNPLUGGED\r\n"); return2; } else { fprintf(stderr,"DEVICE_LINKED\r\n"); return3; } } #endif } intmain(intargc,char*argv[]) { inti=0; if(argc!=2) { fprintf(stderr,"usage:%s \r\n",argv[0]); return-1; } i=cshell_netlink_status(argv[1]); printf("cshell_netlink_statusif_status=%d\n",i); i=c_netlink_status(argv[1]); printf("c_netlink_statusif_status=%d\n",i); return0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。