linux 监控网线拔掉,linux应用层监控网线插拔状态的实现.doc

linux应用层监控网线插拔状态的实现

HYPERLINK "/sunzl1987/archive/2012/05/24/2516635.html"linux应用层监控网线插拔状态的实现 1、对于基于linux2.4内核的uclinux系统如何实现在应用层监控网线插拔状态?2、硬件环境:IPS100(ARM7TDMI)3、实现过程由于linux下的ifconfig命令就能够实现在应用层监控网线插拔状态,例如当网线连接正常时,使用ifconfig?eth0命令,打印的信息中会有RUNNING,而拔掉网线后,再使用ifconfig?eth0命令,RUNNING就不见了。所以,实现Linux应用层监控网线插入状态就相当于自己写一个ifconfig函数。基于这个思路,首先参考ifconfig的源码,可以参考linux自身提供的ifconfig的源码(linux提供的有ifconfig.c函数),也可以在网上查找。首先找到linux自身提供的ifconfig.c函数,既然ifconfig通过RUNNING来判断网络的通断的状况的,首先找到RUNNING的出处,搜索一下发现这句话,If(ptr->flags?&IFF_RUNNIG){Printf(__("RUNNING"));}以这个为切入点,层层向上找,分别是被些函数调用,最后我们进入了main函数(这是理所当然的),在这里的到RUNNING→ife_print()→if_pirint()→main().。先看ife_prinf()函数,这里没有和内核通信,这时我们再看if_print()函数,这里刚好有和内核通信的函数,else?{???????????????????????????????struct?interface?*ife;????????ife?=?lookup_interface(ifname);????????res?=?do_if_fetch(ife);????????if?(res?>=?0)????????????ife_print(ife);????}????这时需要看到lookup_interface(ifname)和do_if_fetch(ife)的原型,由于头文件很多,我没办法知道这两个函数在那个头文件中,所以干脆在网上找到这两个函数的原型,我们找到了一篇ifconfing源码分析的文章,/2574772.html,这里面找到了函数原型,我们看到?do_if_fetch()函数里面又调用了if_fetch()函数,太好了,这个函数正是我们所需要的,在这里面有个很重要的函数ioctl(),ioctl用于向设备发送控制和配置命令,驱动程序可以接收ioctl的数据,并返回数据,ioctl的原型为????ioctl(int?d,?int?cmd,?......),d是某个设备的文件描述符,cmd是ioctl的命令,可变参数取决于cmd,是指向变量或结构体的指针。这里面用到??设备文件描述符skfd?=?socket(AF_INET,SOCK_DGRAM,0);这是一个套接字,作用是打开一个网络通讯端口,成功的话返回skfd,相当于一个文件描述符。???有了这些之后我们就可以写一个自己的简洁版的ifconfig函数了,现在ubuntu10.04上编写代码,代码里面的ioctl函数这样写ioctl(skfd,?SIOCGIFFLAGS,?&ifr)?,其中SIOCGIGGLAGS表示得到sock?i/o的flags,这时因为,RUNNIGN的条件是ptr->flags?&IFF_RUNNING?是否为真,代码里面直接体现eth0,函数为strcpy(ifr.ifr_name,?“eth0”);完整的代码如下:(以下代码在ubuntu 10.04下运行通过)#include?"icconst.h"#include?#include?#include?#include?#include?#include?"net_detect.h"?int?net_detect(char*?net_name){int?skfd?=?0;struct?ifreq?ifr;?skfd?=?socket(AF_INET,?SOCK_DGRAM,?0);if(skfd?0){printf("%s:%d?Open?socket?error!\n",?__FILE__,?__LINE__);return?-1;}?strcpy(ifr.ifr_name,?net_name);?if(ioctl(skfd,?SIOCGIF

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值