Shell查看网线插拔状态:

使用ifconfig命令,如果含有“RUNNING”,说明网线接入,否则就没有。

例:

ifconfig

ifconfig eth0

ifconfig eth0|grep "RUNNING"

================================================================================================

C编程查看网线插拔状态:

参考网络资料,经整理验证ok.

#include

#include

#include

#include

#include

int net_detect(char* net_name)

{

int skfd = 0;

struct ifreq ifr;

struct sockaddr_in *pAddr = NULL;

skfd = socket(AF_INET, SOCK_DGRAM, 0);

if(skfd

{

printf("%s:%d Open socket error!\n", __FILE__, __LINE__);

return -1;

}

strcpy(ifr.ifr_name, net_name);

if(ioctl(skfd, SIOCGIFFLAGS, &ifr) <0 )

{

printf("%s:%d IOCTL error!\n", __FILE__, __LINE__);

printf("Maybe ethernet inferface %s is not valid!", ifr.ifr_name);

close(skfd);

return -1;

}

if(ifr.ifr_flags & IFF_RUNNING)

{

printf("%s is running :)\n", ifr.ifr_name);

}

else

{

printf("%s is not running :(\n", ifr.ifr_name);

}

if(ioctl(skfd,SIOCGIFADDR,&ifr)<0)

{

printf("SIOCGIFADDR IOCTL error!\n");

close(skfd);

return -1;

}

pAddr = (struct sockaddr_in *)&(ifr.ifr_addr);

printf("ip addr :[%s]\n", inet_ntoa(pAddr->sin_addr));

if(ioctl(skfd,SIOCGIFHWADDR,&ifr)<0)

{

printf("SIOCGIFHWADDR IOCTL error!\n");

close(skfd);

return -1;

}

printf("mac addr: %02x:%02x:%02x:%02x:%02x:%02x\n",

(unsigned char)ifr.ifr_hwaddr.sa_data[0],

(unsigned char)ifr.ifr_hwaddr.sa_data[1],

(unsigned char)ifr.ifr_hwaddr.sa_data[2],

(unsigned char)ifr.ifr_hwaddr.sa_data[3],

(unsigned char)ifr.ifr_hwaddr.sa_data[4],

(unsigned char)ifr.ifr_hwaddr.sa_data[5]);

close(skfd);

return 0;

}

void main()

{

net_detect("eth0");

}

参考网络资料:

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源码分析的文章,http://viscar.blog.sohu.com/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

{

printf("%s:%d Open socket error!\n", __FILE__, __LINE__);

return -1;

}

strcpy(ifr.ifr_name, net_name);

if(ioctl(skfd, SIOCGIFFLAGS, &ifr) <0 )

{

printf("%s:%d IOCTL error!\n", __FILE__, __LINE__);

printf("Maybe ethernet inferface %s is not valid!", ifr.ifr_name);

close(skfd);

return -1;

}

if(ifr.ifr_flags & IFF_RUNNING)

{

printf("%s is running :)\n", ifr.ifr_name);

}

else

{

printf("%s is not running :(\n", ifr.ifr_name);

}

/*****************以下为识别ip地址,mac地址***************************************/

if(ioctl(skfd,SIOCGIFADDR,&ifr)<0)

{

printf("SIOCGIFADDR IOCTL error!\n");

close(skfd);

return -1;

}

printf("ip addr :[%s]\n",inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr));

if(ioctl(skfd,SIOCGIFHWADDR,&ifr)<0)

{

printf("SIOCGIFHWADDR IOCTL error!\n");

close(skfd);

return -1;

}

printf("mac addr: %02x:%02x:%02x:%02x:%02x:%02x\n"

(unsigned char)ifr.ifr_hwaddr.sa_data[0],

(unsigned char)ifr.ifr_hwaddr.sa_data[1],

(unsigned char)ifr.ifr_hwaddr.sa_data[2],

(unsigned char)ifr.ifr_hwaddr.sa_data[3],

(unsigned char)ifr.ifr_hwaddr.sa_data[4],

(unsigned char)ifr.ifr_hwaddr.sa_data[5]  );

/*************************************************************************************************************************************/

close(skfd);

return 0;

}

代码里面的struct ifreq 是一个设备请求的结构体,在中定义,SIOCGIFFLAGS使用了ifreq结构,

在ubuntu10.04环境下编译之后,运行#./a.out eth0  即可实现网线插拔的监控。

这时把代码加到uclinux下运行,发现并不能实现ubuntu的效果,这是为什么呢?

初步分析原因,可能是在驱动程序中没有将插拔状态的信息通知内核,所以我们使用ioctl实际上不能获得内核网络设备的状态的信息。我们在《linux设备驱动程序这本书上》看到有两个函数刚好做这件事情:

Void netif_carrier_off(struct net_device*dev);

Void netif_carrier_on(struct net_device*dev);

当驱动检测到设备没有连接好,可以调用netif_carrier_off通知内核这一事情;当设备再次连接好时,调用netif_carrier_on通知内核现在连接好了。

现在我们将这两个函数分别加到驱动程序中,放到监控网线插拔状态的位置,再在unlinux中插拔网线时,会在串口终端打印出相应的状态信息,这时的状态信息完全是在应用层实现的。

4.参考文档:uclinux内核网络驱动源码和ifconfig的源码

《linux设备驱动程序》

shell 判断网线插拔_linux检测网线插拔状态相关推荐

  1. linux查看哪个网卡插着网线,(笔记)Linux下检测网卡与网线连接状态

    Linux下检测网卡与网线连接状态,使用ioctl向socket发送SIOCETHTOOL命令字. #include #include #include #include #include #incl ...

  2. linux如何判断网线插入_快速鉴定网线质量的常用方法

    网线在市面上的种类很多,有好有坏,鱼龙混杂,更有些商家以次充好.网线作为最常用的传输载体,我们有必要了解如何识别它的优劣.测试网线的方法有很多种,山东朗坤小编和大家一起来分享下.尤其是在监控项目中,往 ...

  3. 服务器上线运行正常但不能上网,网线是好的,插笔记本正常上网,插在服务器上却不能上网的解决方法...

    身为一名资深IT人士(呵呵,请允许我臭美一下下~~),在从事IT工作的运维过程中难免遇到一些棘手的问题.奇葩的问题,到底有多奇葩呢,有时会让你意想不到. 比如说,我今天就再次遇到了以前遇到过的奇葩问题 ...

  4. linux如何判断网线插入_斜口钳和网线钳制作网线!

    一:准备工具和材料1:斜口钳:2:剥线刀:3:网线钳:4:空网线:5:水晶头:6:测试仪: 二:详细步骤第1步:首先拿出准备好的一根网线,用剥线刀进行剥线:把网线放入剥线刀里面,剥线刀不动,网线进行转 ...

  5. 不使用网线就无法将两台计算机连接成网络,用同一根网线分成两根,分别插进两台电脑,并且用两个不同的账号连接上网络时,会相互抢网速吗...

    用同一根网线分成两根,分别插进两台电脑,并且用两个不同的账号连接上网络时,会相互抢网速吗以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一 ...

  6. shell如何检测linux发行版本,shell判断软件版本

    shell脚本如何检查软件包是否安装成功 你的Linux是什么发行版的啊?最常用的发行版的软件包管理系统有Debian系(包括Debian,Ubuntu,Mint等)和Red Hat系(包括RHEL, ...

  7. 客户端拔掉网线后,会直接影响 TCP 连接状态吗?

    大家好,我是小林. 今天,聊一个有趣的问题:拔掉网线几秒,再插回去,原本的 TCP 连接还存在吗? 可能有的同学会说,网线都被拔掉了,那说明物理层被断开了,那在上层的传输层理应也会断开,所以原本的 T ...

  8. 网线信道测试软件,测试网线是否正常的方法有哪些

    [导读]随着网络的普及,网络成为了我们生活中必不可少的一部分,网线更是网络布线当中最为重要的组成部分.我相信在日常生活中常常会遇到这样的情况,当我们断网的时候,首先第一个怀疑的对象都是网线.那么,测试 ...

  9. iphone检测耳机插入/拔出

    iphone检测耳机插入/拔出 开发过程中录音和播放这块碰到了一些问题,麻烦的主要有三个: 检测是否有声音输入设备 当有多个声音输出设备时,指定声音输出设备 检测耳机的插入和拔出 第一个问题,对于iT ...

最新文章

  1. 一份完整的聚合支付中心设计方案!
  2. Hive group by实现-就是word 统计
  3. 实战并发编程 - 05等效不可变对象CopyOnWriteArrayList适用场景剖析_写时复制COW
  4. win7建立wifi热点
  5. 解题报告——例题5-8 Unix is 命令(UVa 400)——26行代码解决
  6. LAMP部署脚本--安装篇
  7. 橡皮筋还能发动载人飞行器?
  8. Redis系统管理相关指令简介
  9. 648 页全彩 + 395张插图 的机器翻译传奇巨作 -- 送几本~
  10. ubuntu 18.04虚拟机访问Windows磁盘或文件夹
  11. Qt之调用Windows图片查看器预览图片
  12. 网页在线视频播放大全
  13. 密码学,有限域GF(2^8)乘法计算,不可约多项式为P(x)=x^8+x^4+x^3+x+1
  14. IDEA集成Java性能分析神器JProfiler
  15. 深度学习理论与实践——课程笔记(一)
  16. java使用POI5.0生成简易Excel工作簿的一种方法
  17. 程序员偷看了老板的微信分组,惊呆了……
  18. 15、 Flutter Widgets 之 ClipRect,ClipRRect,ClipOval,ClipPath,CustomClipper,裁剪组件
  19. threejs 实现场景围绕鼠标缩放,而不是默认的场景缩放中心
  20. 网站被降权了怎么办?

热门文章

  1. 领域建模——架构设计的第一步(上)
  2. 数据分析sql面试必会6题经典_数据分析师SQL面试必备50题
  3. python中str.center()的功能是什么_Python str内部功能介绍
  4. linux命令中tar后的zxvf分别表示含义
  5. 利用python将json数据转换为csv格式
  6. Zemax操作--4(公差问题)
  7. 这5款PC工具不容错过,抓紧收藏起来
  8. 数据到底如何搞定电影票房预测?
  9. 合同索赔的内容和处理方法
  10. 怎样对一个项目进行成本管理,具体步骤是啥?