用C/C++实现linux下检测网络接口状态
本文实例为大家分享了使用C/C++实现linux下检测网络接口状态,供大家参考,具体内容如下
要写个检测网络接口链接状态的东西,又不喜欢不断的ping别的地址,也不想调用其他命令行工具来做这个,于是在google了n多内容未果之后,搜到个检测工具的源代码。
以下代码在fedora9/CentOS5.2下调试通过:)
#include#include #include #include #include #include #include structethtool_value { __uint32_tcmd; __uint32_tdata; }; /*return1:hascable;return0:nocable*/ intdetect_eth_cable(char*ifname) { structethtool_valueedata; structifreqifr; intfd=-1,err=0; memset(&ifr,0,sizeof(ifr)); strcpy(ifr.ifr_name,ifname); fd=socket(AF_INET,SOCK_DGRAM,0); if(fd<0){ //perror("Cannotgetcontrolsocket"); return-1; } edata.cmd=0x0000000A; ifr.ifr_data=(caddr_t)&edata; err=ioctl(fd,0x8946,&ifr); if(err==0){ fprintf(stdout,"Linkdetected:%s\n",edata.data?"yes":"no"); }elseif(errno!=EOPNOTSUPP){ perror("Cannotgetlinkstatus"); } return(edata.data==1?1:0); } intmain(intargc,char**argv) { detect_eth_cable("p1p1"); return0; }
其他代码:
intget_netportstatus(constchar*interface){ charcmd[1024]; char*tt; FILE*fp; intdevflag; devflag=get_netflag(interface); if(devflag==DEV_DOWN){ sprintf(cmd,"ifconfig%sup",interface); system(cmd); } sprintf(cmd,"ethtool%s|grep\"Linkdetected\">/tmp/eth.temp",interface); system(cmd); if(devflag==DEV_DOWN){ sprintf(cmd,"ifconfig%sdown",interface); system(cmd); } fp=fopen("/tmp/eth.temp","r"); if(fp==NULL){ system("rm-rf/tmp/eth.temp"); return-1; } fgets(cmd,1024,fp); fclose(fp); system("rm-rf/tmp/eth.temp"); tt=strstr(cmd,"no"); if(tt!=NULL)returnLINK_DOWN; tt=strstr(cmd,"yes"); if(tt!=NULL)returnLINK_UP; return-1; }
#include#include #include #include #include #include #include structethtool_value{ __uint32_tcmd; __uint32_tdata; }; intmain(int,char*[]) { structethtool_valueedata; intfd=-1,err=0; structifreqifr; memset(&ifr,0,sizeof(ifr)); strcpy(ifr.ifr_name,"eth0"); fd=socket(AF_INET,SOCK_DGRAM,0); if(fd<0){ perror("Cannotgetcontrolsocket"); return70; } edata.cmd=0x0000000a; ifr.ifr_data=(caddr_t)&edata; err=ioctl(fd,0x8946,&ifr); if(err==0){ fprintf(stdout,"Linkdetected:%s\n", edata.data?"yes":"no"); }elseif(errno!=EOPNOTSUPP){ perror("Cannotgetlinkstatus"); } return0; }
#include//IFF_RUNNING //如果网卡已脸上网线,返回0,否则返回-1. intcheck_nic(char*nic) { structifreqifr; intskfd=socket(AF_INET,SOCK_DGRAM,0); strcpy(ifr.ifr_name,nic_name); if(ioctl(skfd,SIOCGIFFLAGS,&ifr)<0) { return-1; } if(ifr.ifr_flags&IFF_RUNNING) return0;//网卡已插上网线 elsereturn-1; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。