在嵌入式产品上,如何让用户选择有线还是无线上网呢?如何让他们判断使用了哪种方式上网呢?我们是这样处理的:优先使用网线上网,稳定。即程序自动判断,如果插了网线,则使用网线上网,如果没有网线连接,则无线上网。

所以,问题的重点是如何判断用户是否插了网线!

一、读取/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检测网线热插拔事件相关推荐

  1. linux检测网线插拔小程序

    参考网络资料,经整理验证ok. #include <sys/socket.h> #include <sys/ioctl.h> #include <linux/if.h&g ...

  2. Linux下自动检测USB热插拔

    做嵌入式开发,尤其在网关.路由器或者其他支持USB设备的终端上,为了提高用户体验,我们常常需要支持自动识别并挂载USB设备功能.某些应用程序,在使用USB设备的过程中,也希望能够侦测到USB断开事件, ...

  3. linux中的热插拔和mdev机制

    mdev手册(自己翻译的留着看) mdev实现U盘或SD卡的自动挂载 mdev的使用以及mdev.conf的规则配置--busybox linux中的热插拔和mdev机制 关于实现udev/mdev自 ...

  4. Linux -- ***检测系统(IDS)介绍及应用(1)

    一.***检测工具简介 Internet上的服务器一般都会被安置在防火墙的DMZ(Demilitarized Zone)区,受到防火墙的保护.这在一定程度可以防止具有已知非法特征的危险连接和恶意*** ...

  5. 使用STM32F4标准外设库实现网线热插拔- 分析STM3240G-EVAL官方工程

    前言 从同事的工程(STM32F4 StdPeriph_Lib)上改出一个新工程. 将其他bug改完, 发现网线必须一直插着, 否则就会卡在网卡初始化那里. 因为我做成了, 如果网卡初始化不成功, 就 ...

  6. SMT32F407+FreeRTOS+LWIP+LAN8720使用Cube MX情况下无法实现网线热插拔

    项目场景: STM32F407+LAN8720使用Cube MX HAL库生成工程: 问题描述 使用Cube MX生成STM32F407+Free RTOS + LAN8720工程,在可以ping通后 ...

  7. Linux 键盘/鼠标 按键事件 编程

    文章目录 Linux 键盘/鼠标 按键事件 编程 1. 头文件 2. 以只读方式打开对应的字符设备文件 3. 读取文件信息 4. 浅析`struct input_event`结构体各成员值 按键`co ...

  8. linux 修改dmi信息,如何从linux清除DMI系统事件日志?

    可以从Linux清除SEL(系统事件日志).根据您可用的接口将决定如何完成. 我的supermirco工作站以及大多数服务器都有IPMI. 您可以检查您的系统是否注册了带有dmidecode的IPMI ...

  9. Linux 模拟 鼠标 键盘 事件

    /************************************************************************* Linux 模拟 鼠标 键盘 事件* 说明:* 以 ...

  10. linux检测端口是否开放的3种命令

    linux检测端口是否开放的3种命令: 默认都是没装的,需额外apt-get或yum安装 1.telnet: # telnet 10.0.0.2 22 2.nmap: # nmap 10.0.0.2 ...

最新文章

  1. Java中stringBuilder
  2. embedding层和全连接层的区别是什么 一般说embedding层,实现方式就是一个没有bias的fc层
  3. 64 任务调度神器 Airflow
  4. 一份厘清「数据指标」问题的清单
  5. c语言请编写函数mygets,c语言中请编写函数mygets和myputs,其功能分别与gets与puts相同,函数中用getchar和putchar读入和输出字符...
  6. 对SQL server、Oracle、MySQL和PostgreSQL进行OLTP性能测试(Benchmark)
  7. 在WebGL场景中进行棋盘操作的实验
  8. 获取当天日期、昨天日期
  9. 基于视觉的烟雾/火焰检测数据集整理(检测、识别、分割)
  10. 最大矩阵和 2015-05-13 21:23 8人阅读 评论(0) 收藏...
  11. 在cygwin下安装CRF++
  12. php libev扩展使用
  13. Could not resolve type alias ‘‘
  14. python 微信步数修改
  15. android 下载apk后如何安装程序,Android下载并安装APK
  16. 51单片机系列——定时/计数器
  17. 前端不错的相关网站和论坛
  18. word文档如何排版图片
  19. 视频转换生成二维码,扫码直接播放,在线制作,一键上传
  20. 中国的因特网低谷 ---- 2000:从希望云端到幻灭低谷

热门文章

  1. e当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过Windows
  2. NLP-实体消歧/实体统一
  3. C语言实现图片找茬,[创意心得]大家来找茬(C语言)
  4. 英语背单词有用吗_学英语千万不要背单词 背单词有效吗
  5. mysql执行sql流程_mysql 执行sql流程
  6. 【杂学笔记-表观遗传学-updating】
  7. win10右键卡顿原因_如何解决Win10桌面右键一直卡顿转圈的问题?
  8. Ubuntu虚拟机安装
  9. python用smtplib、emai模块群发邮件
  10. CCS+JS绘制星型拓扑图(关系图)