用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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。