博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux中读取网卡插拔状态
阅读量:2254 次
发布时间:2019-05-09

本文共 2066 字,大约阅读时间需要 6 分钟。

原创文章,转载请说明出处:

废话不多说,直接上程序:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef unsigned short u16;typedef unsigned int u32;typedef unsigned char u8;int detect_mii(int skfd, char *ifname){ struct ifreq ifr; u16 *data, mii_val; unsigned phy_id; /* Get the vitals from the interface. */ strncpy(ifr.ifr_name, ifname, IFNAMSIZ); if (ioctl(skfd, SIOCGMIIPHY, &ifr) < 0) { fprintf(stderr, "SIOCGMIIPHY on %s failed: %s/n", ifname, strerror(errno)); (void) close(skfd); return 2; } data = (u16 *)(&ifr.ifr_data); phy_id = data[0]; data[1] = 1; if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0) { fprintf(stderr, "SIOCGMIIREG on %s failed: %s/n", ifr.ifr_name, strerror(errno)); return 2; } mii_val = data[3]; return(((mii_val & 0x0016) == 0x0004) ? 0 : 1);}int detect_ethtool(int skfd, char *ifname){ struct ifreq ifr; struct ethtool_value edata; memset(&ifr, 0, sizeof(ifr)); edata.cmd = ETHTOOL_GLINK; strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)-1); ifr.ifr_data = (char *) &edata; if (ioctl(skfd, SIOCETHTOOL, &ifr) == -1) { printf("ETHTOOL_GLINK failed: %s/n", strerror(errno)); return 2; } return (edata.data ? 0 : 1);}/*================================================================================FUNCTION: CheckNetDESCRIPTION: check network statusARGUMENTS PASSED: None.RETURN VALUE: 0 up 1 down 2 error==================================================================================*/int CheckNet(){ int skfd = -1; char *ifname = "eth0"; int retval; /* Open a socket. */ if (( skfd = socket( AF_INET, SOCK_DGRAM, 0 ) ) < 0 ) { printf("socket error/n"); exit(-1); } retval = detect_ethtool(skfd, ifname); if (retval == 2) retval = detect_mii(skfd, ifname); close(skfd); return retval;}int main(int argc, char **argv){ int ret = -1,retold = -1; while(1) { ret = CheckNet(); if(ret != retold) { retold = ret; if (ret == 2) printf("Could not determine status/n"); if (ret == 1) printf("Link down\n"); if (ret == 0) printf("Link up\n"); } }}

你可能感兴趣的文章
记PE文件中读写资源
查看>>
do{...}while(0)的意义和用法
查看>>
生命需要思考
查看>>
两个经典的RGB与YUV转换函数
查看>>
各种RGB和YUV相互转换的代码
查看>>
谈谈数据库开发的分层
查看>>
WebService客户端设计期TClientDataSet.ProviderName无值解决
查看>>
像素与分辨率
查看>>
udp、tcp 杂项
查看>>
Linux网络编程经典书籍推荐
查看>>
基于libRTMP的流媒体直播之 AAC、H264 推送
查看>>
将h.264视频流封装成flv格式文件(一.flv格式)
查看>>
UTF8编码表
查看>>
后生可畏
查看>>
webrtc音视频开发
查看>>
ams录像实现
查看>>
msys2安装配置
查看>>
H.264协议:Annex B格式和AVCC格式
查看>>
Delphi异常机制与SEH
查看>>
Understanding Rate Control Modes (x264, x265, vpx)
查看>>