首页 > 系统相关 >Linux下检测网卡与网线连通状态

Linux下检测网卡与网线连通状态

时间:2023-01-19 11:31:50浏览次数:54  
标签:return name ifr int 网线 网卡 read Linux include


Linux_stat.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/sockios.h>
#include <linux/ethtool.h>
int get_netlink_status(const char *if_name);
int main()
{
if(getuid() != 0)
{
fprintf(stderr, "Netlink Status Check Need Root Power./n");
return 1;
}

printf("Net link status: %d/n", get_netlink_status("eth0"));
return 0;
}
// if_name like "ath0", "eth0". Notice: call this function
// need root privilege.
// return value:
// -1 -- error , details can check errno
// 1 -- interface link up
// 0 -- interface link down.
int get_netlink_status(const char *if_name)
{
int skfd;
struct ifreq ifr;
struct ethtool_value edata;
edata.cmd = ETHTOOL_GLINK;
edata.data = 0;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name) - 1);
ifr.ifr_data = (char *) &edata;
if (( skfd = socket( AF_INET, SOCK_DGRAM, 0 )) < 0)
return -1;
if(ioctl( skfd, SIOCETHTOOL, &ifr ) == -1)
{
close(skfd);
return -1;
}
close(skfd);
return edata.data;
}

在linux下使用ifconfigl命令能很方便的查看网卡与网线是否连通,运行ifconfig eth0命令大致输出如下:

​​# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:25:35:68:CC:D6
inet addr:192.168.1.168 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::215:c5ff:fe18:ccd6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:130722 errors:0 dropped:0 overruns:0 frame:0
TX packets:112560 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:104371099 (99.5 MiB) TX bytes:20518584 (19.5 MiB)
Interrupt:16

其中的RUNNING就表示网卡与网线正常链接,拔掉网线再运行此命令就会发现RUNNING不在了。

    我的目的是用C语言来实现程序,而linux系统提供了popen/pclose进程管道让C和shell很方便的交互,不过使用的时候要注意设置权限, 以免造成安全隐患。废话不多说,看下面C代码结合shell命令检测网卡与网线连通状况:
netstat.c

​​#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/**********************************************************************
* 函数名称: GetNetStat
* 功能描述: 检测网络链接是否断开
* 输入参数:
* 输出参数: 无
* 返 回 值: 正常链接1,断开返回-1
* 其它说明: 本程序需要超级用户权限才能成功调用ifconfig命令
* 修改日期 版本号 修改人 修改内容
* ---------------------------------------------------------------------
* 2010/04/02 V1.0 eden_mgqw
***********************************************************************/
int GetNetStat( )
{
char buffer[BUFSIZ];
FILE *read_fp;
int chars_read;
int ret;

memset( buffer, 0, BUFSIZ );
read_fp = popen("ifconfig eth0 | grep RUNNING", "r");
if ( read_fp != NULL )
{
chars_read = fread(buffer, sizeof(char), BUFSIZ-1, read_fp);
if (chars_read > 0)
{
ret = 1;
}
else
{
ret = -1;
}
pclose(read_fp);
}
else
{
ret = -1;
}

return ret;
}


int main()
{
int i=0;
i = GetNetStat();
printf( "/nNetStat = %d/n", i );
return 0;
}


下面是编译运行程序的输出结果(正常返回1,断开返回-1):
# cc netstat.c
# ./a.out
NetStat = 1

在此特别感谢linuxeden的shell区版主li-jiahuan帅锅,为本文提供了shell支持-_-!

标签:return,name,ifr,int,网线,网卡,read,Linux,include
From: https://blog.51cto.com/tody/6019981

相关文章

  • LINUX学习之文件处理常用命令(三)
    ls命令描述ls命令是linux系统中用来列出文件和目录的常用命令,它可以显示文件和目录的名称、权限、大小、修改时间等信息以下是ls命令的常用参数:-a:列出全部的文件,连......
  • linux abrt的用法
    在linux调试程序,最痛苦的就是程序异常宕掉,但是找不到core文件,很难定位问题。但是有了core文件就容易定位多了。一般是可以通过在环境变量中设置ulimit-cunlimited。但是现......
  • Linux 离线安装rpm包
    1.在离线服务器执行yum安装命令,查看所需要的rpm包,以ntp服务为例    上面3个就是我们需要下载的rpm包2.找一台联网的服务器下载rpm包yum-yinstallntp--down......
  • Linux安装KingbaseES数据库 Unsupported major.minor version错误处理
    Linux系统安装V008R006C007B0012版本KingbaseES数据库报错:Unsupportedmajor.minorversion52.0系统版本:[root@vm-10-37-129-15~]#cat/etc/redhat-releaseRedHa......
  • Linux基础 day3
    <divid="cnblogs_post_body"class="blogpost-body"><h1id="linnux系统常见目录及文件"tid="tid-WwZEp6">linnux系统常见目录及文件<buttonclass="cnblogs-toc-button"......
  • linux基础 day2 命令基础知识、必须掌握的命令、根目录结构、重要文件数据(部分)
    一、linux命令基础知识命令提示符[root@Star~]#root指当前登录主机的用户Star是主机名称,我们前面自己创虚拟机时设置的名称~是家目录,默认环境为家目录,不等于......
  • linux基础 day1 VM创好虚拟机后的配置、centos系统配置、远程连接工具
    一、虚拟机的配置先配网络再配系统镜像注意:这里用的是centos7二、centos系统配置1.首先在虚拟机启动页面不要急着进去,先改一下网卡名称,敲好后回车,等图形界......
  • Linux服务器 MATLAB 安装
    在Ubuntu安装配置MATLAB开发环境https://muzing.top/posts/52276c1/Linux下基于MobaXterm的无图形界面MatlabR2018a安装https://www.cnblogs.com/Jody9123/p/13447273......
  • Linux
    用户相关命令1.创建用户:adduserusername2.修改用户组:usermod-ggroupnameusername3.删除组:groupdelgroupname4.删除用户:deluser-rusername(-r是为了顺......
  • 解决docker启动报错“Error starting daemon: SELinux is not supported with the ove
    启动docker报错,这个是关于selinux的问题。一般的做法是内核升级或者关闭docker的selinux部分--selinux-enabled=false ......