本文实例为大家分享了使用C/C++实现linux下检测网络接口状态,供大家参考,具体内容如下
要写个检测网络接口链接状态的东西,又不喜欢不断的ping别的地址,也不想调用其他命令行工具来做这个,于是在google了n多内容未果之后,搜到个检测工具的源代码。
以下代码在fedora 9 / CentOS 5.2下调试通过:)
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#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, "Link detected: %s\\n", edata.data ? "yes":"no");
} else if (errno != EOPNOTSUPP) {
perror("Cannot get link status");
}
return(edata.data==1 ? 1:0);
}
int main(int argc, char**argv)
{
detect_eth_cable("p1p1");
return 0;
}
|
其他代码:
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
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;
}
|
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#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, "Link detected: %s\\n",
edata.data ? "yes":"no");
} else if (errno != EOPNOTSUPP) {
perror("Cannot get link status");
}
return 0;
}
|
?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#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>
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。
相关文章
猜你喜欢
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-27 58
-
2025-05-25 81
-
2025-05-27 49
-
2025-05-25 47
-
2025-05-29 23
热门评论

