LINUX检测网线热插拔事件
在嵌入式产品上,如何让用户选择有线还是无线上网呢?如何让他们判断使用了哪种方式上网呢?我们是这样处理的:优先使用网线上网,稳定。即程序自动判断,如果插了网线,则使用网线上网,如果没有网线连接,则无线上网。
所以,问题的重点是如何判断用户是否插了网线!
一、读取/proc/net/dev
$ cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carriercompressed
lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
eth0: 3439 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0
在开发板上/proc/net目录下,还有很多关于网络的信息的文件,如果启动开发板后,eth0中bytes、packets 不为0,那它一定插了网线,但此种方法只适合开机启动时判断,之后的话,就很麻烦了。
获取/proc/net/dev的信息,需要借助getline()函数和sscanf()函数。可链接:getline()函数
二、通过ifconfig的RUNNING判断
1、插网线:
$ ifconfig eth0
eth0 Link encap:Ethernet HWaddr 06:ED:B5:C3:AA:23
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:159 errors:0 dropped:0overruns:0 frame:0
TX packets:0 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:23822 (23.2 KiB) TX bytes:0 (0.0 B)
Interrupt:14
2、拔网线:
/mnt/wifi$ ifconfig eth0
eth0 Link encap:Ethernet HWaddr 06:ED:B5:C3:AA:23
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:160 errors:0 dropped:0overruns:0 frame:0
TX packets:0 errors:0 dropped:0overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:24055 (23.4 KiB) TX bytes:0 (0.0 B)
Interrupt:14
通过红字的RUNNING来区分是否插拔网线。
三、通过Netlink实现网卡上下线监控
#include <sys/types.h>
#include <sys/socket.h>
#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <linux/if.h>
#include <string.h> #define BUFLEN 20480 int main(int argc, char *argv[])
{ int fd, retval; char buf[BUFLEN] = {0}; int len = BUFLEN; struct sockaddr_nl addr; struct nlmsghdr *nh; struct ifinfomsg *ifinfo; struct rtattr *attr; fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &len, sizeof(len)); memset(&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; addr.nl_groups = RTNLGRP_LINK; bind(fd, (struct sockaddr*)&addr, sizeof(addr)); while ((retval = read(fd, buf, BUFLEN)) > 0) { for (nh = (struct nlmsghdr *)buf; NLMSG_OK(nh, retval); nh = NLMSG_NEXT(nh, retval)) { if (nh->nlmsg_type == NLMSG_DONE) break; else if (nh->nlmsg_type == NLMSG_ERROR) return -1; else if (nh->nlmsg_type != RTM_NEWLINK) continue; ifinfo = NLMSG_DATA(nh); printf("%u: %s", ifinfo->ifi_index, (ifinfo->ifi_flags & IFF_LOWER_UP) ? "up" : "down" ); attr = (struct rtattr*)(((char*)nh) + NLMSG_SPACE(sizeof(*ifinfo))); len = nh->nlmsg_len - NLMSG_SPACE(sizeof(*ifinfo)); for (; RTA_OK(attr, len); attr = RTA_NEXT(attr, len)) { if (attr->rta_type == IFLA_IFNAME) { printf(" %s", (char*)RTA_DATA(attr)); break; } } printf("\n"); } } return 0;
}
LINUX检测网线热插拔事件相关推荐
- linux检测网线插拔小程序
参考网络资料,经整理验证ok. #include <sys/socket.h> #include <sys/ioctl.h> #include <linux/if.h&g ...
- Linux下自动检测USB热插拔
做嵌入式开发,尤其在网关.路由器或者其他支持USB设备的终端上,为了提高用户体验,我们常常需要支持自动识别并挂载USB设备功能.某些应用程序,在使用USB设备的过程中,也希望能够侦测到USB断开事件, ...
- linux中的热插拔和mdev机制
mdev手册(自己翻译的留着看) mdev实现U盘或SD卡的自动挂载 mdev的使用以及mdev.conf的规则配置--busybox linux中的热插拔和mdev机制 关于实现udev/mdev自 ...
- Linux -- ***检测系统(IDS)介绍及应用(1)
一.***检测工具简介 Internet上的服务器一般都会被安置在防火墙的DMZ(Demilitarized Zone)区,受到防火墙的保护.这在一定程度可以防止具有已知非法特征的危险连接和恶意*** ...
- 使用STM32F4标准外设库实现网线热插拔- 分析STM3240G-EVAL官方工程
前言 从同事的工程(STM32F4 StdPeriph_Lib)上改出一个新工程. 将其他bug改完, 发现网线必须一直插着, 否则就会卡在网卡初始化那里. 因为我做成了, 如果网卡初始化不成功, 就 ...
- SMT32F407+FreeRTOS+LWIP+LAN8720使用Cube MX情况下无法实现网线热插拔
项目场景: STM32F407+LAN8720使用Cube MX HAL库生成工程: 问题描述 使用Cube MX生成STM32F407+Free RTOS + LAN8720工程,在可以ping通后 ...
- Linux 键盘/鼠标 按键事件 编程
文章目录 Linux 键盘/鼠标 按键事件 编程 1. 头文件 2. 以只读方式打开对应的字符设备文件 3. 读取文件信息 4. 浅析`struct input_event`结构体各成员值 按键`co ...
- linux 修改dmi信息,如何从linux清除DMI系统事件日志?
可以从Linux清除SEL(系统事件日志).根据您可用的接口将决定如何完成. 我的supermirco工作站以及大多数服务器都有IPMI. 您可以检查您的系统是否注册了带有dmidecode的IPMI ...
- Linux 模拟 鼠标 键盘 事件
/************************************************************************* Linux 模拟 鼠标 键盘 事件* 说明:* 以 ...
- linux检测端口是否开放的3种命令
linux检测端口是否开放的3种命令: 默认都是没装的,需额外apt-get或yum安装 1.telnet: # telnet 10.0.0.2 22 2.nmap: # nmap 10.0.0.2 ...
最新文章
- Java中stringBuilder
- embedding层和全连接层的区别是什么 一般说embedding层,实现方式就是一个没有bias的fc层
- 64 任务调度神器 Airflow
- 一份厘清「数据指标」问题的清单
- c语言请编写函数mygets,c语言中请编写函数mygets和myputs,其功能分别与gets与puts相同,函数中用getchar和putchar读入和输出字符...
- 对SQL server、Oracle、MySQL和PostgreSQL进行OLTP性能测试(Benchmark)
- 在WebGL场景中进行棋盘操作的实验
- 获取当天日期、昨天日期
- 基于视觉的烟雾/火焰检测数据集整理(检测、识别、分割)
- 最大矩阵和 2015-05-13 21:23 8人阅读 评论(0) 收藏...
- 在cygwin下安装CRF++
- php libev扩展使用
- Could not resolve type alias ‘‘
- python 微信步数修改
- android 下载apk后如何安装程序,Android下载并安装APK
- 51单片机系列——定时/计数器
- 前端不错的相关网站和论坛
- word文档如何排版图片
- 视频转换生成二维码,扫码直接播放,在线制作,一键上传
- 中国的因特网低谷 ---- 2000:从希望云端到幻灭低谷
热门文章
- e当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过Windows
- NLP-实体消歧/实体统一
- C语言实现图片找茬,[创意心得]大家来找茬(C语言)
- 英语背单词有用吗_学英语千万不要背单词 背单词有效吗
- mysql执行sql流程_mysql 执行sql流程
- 【杂学笔记-表观遗传学-updating】
- win10右键卡顿原因_如何解决Win10桌面右键一直卡顿转圈的问题?
- Ubuntu虚拟机安装
- python用smtplib、emai模块群发邮件
- CCS+JS绘制星型拓扑图(关系图)