int get_netportstatus(const char *interface) {
char cmd[1024];
char *tt;
FILE *fp;
int devflag;
devflag=get_netflag(interface);
if (devflag==DEV_DOWN) {
sprintf(cmd,"ifconfig %s up",interface);
system(cmd);
}
sprintf(cmd,"ethtool %s | grep "Link detected" > /tmp/eth.temp",interface);
system(cmd);
if (devflag==DEV_DOWN) {
sprintf(cmd,"ifconfig %s down",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) return LINK_DOWN;
tt=strstr(cmd,"yes");
if (tt!=NULL) return LINK_UP;
return -1;
}
用c/c++实现linux下检测网络接口状态
#include #include #include #include #include #include #include struct ethtool_value {
__uint32_t cmd;
__uint32_t data;
};
int main(int , char* [])
{
struct ethtool_value edata;
int fd = -1, err = 0;
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, "eth0");
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
perror("Cannot get control socket");
return 70;
}
edata.cmd = 0x0000000a;
ifr.ifr_data = (caddr_t)&edata;
err = ioctl(fd, 0x8946, &ifr);
if (err == 0) {
fprintf(stdout, "Link detected: %sn",
edata.data ? "yes":"no");
} else if (errno != EOPNOTSUPP) {
perror("Cannot get link status");
}
return 0;
}
#include // IFF_RUNNING
//如果网卡已脸上网线,返回0,否则返回-1.
int check_nic(char *nic)
{
struct ifreq ifr;
int skfd = 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)
return 0; // 网卡已插上网线
else return -1;
}