本文实例为大家分享了使用C/C++实现linux下检测网络接口状态,供大家参考,具体内容如下
要写个检测网络接口链接状态的东西,又不喜欢不断的ping别的地址,也不想调用其他命令行工具来做这个,于是在google了n多内容未果之后,搜到个检测工具的源代码。
以下代码在fedora 9 / CentOS 5.2下调试通过:)
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <errno.h>
#include <net/if.h>
struct ethtool_value
{
__uint32_t cmd;
__uint32_t data;
};
/*return 1:has cable; return 0:no cable*/
int detect_eth_cable(char *ifname)
{
struct ethtool_value edata;
struct ifreq ifr;
int fd = -1, err = 0;
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, ifname);
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
//perror("Cannot get control socket");
return -1;
}
edata.cmd = 0x0000000A;
ifr.ifr_data = (caddr_t)&edata;
err = ioctl(fd, 0x8946, &ifr);
if (err == 0) {
fprintf(stdout, " detected: %s\n", edata.data ? "yes":"no");
} else if (errno != EOPNOTSUPP) {
perror("Cannot get status");
}
return(edata.data==1 ? 1:0);
}
int main(int argc, char**argv)
{
detect_eth_cable("p1p1");
return 0;
}
其他代码:
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 \" 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 _DOWN;
tt=strstr(cmd,"yes");
if (tt!=NULL) return _UP;
return -1;
}
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <errno.h>
#include <net/if.h>
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, " detected: %s\n",
edata.data ? "yes":"no");
} else if (errno != EOPNOTSUPP) {
perror("Cannot get status");
}
return 0;
}
#include <net if.h=""> // 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;
}
</net>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
继续阅读与本文标签相同的文章
下一篇 :
小程序诞生两年,BAT 们得到的与失去的
-
丘成桐:我国应重视基础科学和数学的发展
2026-05-15栏目: 教程
-
Win10系统竟自带了表情包?你知道在哪吗?
2026-05-15栏目: 教程
-
中国芯片研究再获国际顶会最佳论文提名!清华魏少军、刘雷波团队出品
2026-05-15栏目: 教程
-
全网“传奇手游”相关搜索排名TOP100 全网“传奇手游”相关搜索排行榜
2026-05-15栏目: 教程
-
又一国产巨头崛起!19天狂建1367个5G基站,日韩始料不及
2026-05-15栏目: 教程
