当前位置: 首页 > news >正文

自己实现一个自动检测网卡状态,并设置ip地址

阅读本文前,请先学习下面几篇文章

《搞懂进程组、会话、控制终端关系,才能明白守护进程干嘛的?》

《简简单单教你如何用C语言列举当前所有网口!》

《Linux下C语言操作网卡的几个代码实例!特别实用》

《安卓如何设置开机自动启动某个程序?ramdisk + init.rc给你搞定》

一、usb网卡应该如何实现?

前文讲了如何利用开源软件ifplugd实现监测网口状态变化,

ifplugd的确可以实现监测网卡的状态,并执行相应脚本,

但是有个前提,就是网口已经注册到系统中,即用ifconfig -a能查看到

如何是usb网卡这种设备,在插入usb口之后网口设备才会注册

使用过程中可能随时会拔掉usb网卡,

那么这种情况下,要想设置usb网卡,那么就就需要修改ifplugd程序。

为了方便大家理解,本文给大家讲解如何自己实现一个简化的程序ethcheck

可以实现自动监测网卡是否存在

rk3568所有网口:

rk3568_r:/system # ifconfig -a                                                
lo        Link encap:Local Loopback                                           inet addr:127.0.0.1  Mask:255.0.0.0                                 inet6 addr: ::1/128 Scope: Host                                     UP LOOPBACK RUNNING  MTU:65536  Metric:1                            RX packets:0 errors:0 dropped:0 overruns:0 frame:0                  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                collisions:0 txqueuelen:1000                                        RX bytes:0 TX bytes:0                                               dummy0    Link encap:Ethernet  HWaddr fa:85:6c:74:1b:7d                       inet6 addr: fe80::f885:6cff:fe74:1b7d/64 Scope: Link                UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1                      RX packets:0 errors:0 dropped:0 overruns:0 frame:0                  TX packets:8 errors:0 dropped:0 overruns:0 carrier:0                collisions:0 txqueuelen:1000                                        RX bytes:0 TX bytes:560                                             sit0      Link encap:IPv6-in-IPv4                                             NOARP  MTU:1480  Metric:1                                           RX packets:0 errors:0 dropped:0 overruns:0 frame:0                  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                collisions:0 txqueuelen:1000                                        RX bytes:0 TX bytes:0                                               ip6tnl0   Link encap:UNSPEC                                                   NOARP  MTU:1452  Metric:1                                           RX packets:0 errors:0 dropped:0 overruns:0 frame:0                  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                collisions:0 txqueuelen:1000                                        RX bytes:0 TX bytes:0                                               eth1      Link encap:Ethernet  HWaddr 5a:53:63:cf:dd:0b  Driver rk_gmac-dwmac UP BROADCAST MULTICAST  MTU:1500  Metric:1                          RX packets:0 errors:0 dropped:0 overruns:0 frame:0                  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                collisions:0 txqueuelen:1000                                        RX bytes:0 TX bytes:0                                               Interrupt:51                                                        ip_vti0   Link encap:UNSPEC                                                   NOARP  MTU:1480  Metric:1                                           RX packets:0 errors:0 dropped:0 overruns:0 frame:0                  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                collisions:0 txqueuelen:1000                                        RX bytes:0 TX bytes:0                                               eth0      Link encap:Ethernet  HWaddr 5e:53:63:cf:dd:0b  Driver rk_gmac-dwmac UP BROADCAST MULTICAST  MTU:1500  Metric:1                          RX packets:0 errors:0 dropped:0 overruns:0 frame:0                  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                collisions:0 txqueuelen:1000                                        RX bytes:0 TX bytes:0                                               Interrupt:38                                                        ip6_vti0  Link encap:UNSPEC                                                   NOARP  MTU:1364  Metric:1                                           RX packets:0 errors:0 dropped:0 overruns:0 frame:0                  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0                collisions:0 txqueuelen:1000                                        RX bytes:0 TX bytes:0                                               

二、程序设计

0.程序框图

1. 设置程序为守护进程

因为该程序最终要在后台执行,并且常驻内存,所以必须将该进程设置为守护进程

关于守护进程的内容,请参考下面文章:

《搞懂进程组、会话、控制终端关系,才能明白守护进程干嘛的?》

参考代码如下:

void init_daemon(void)
{int pid;int i;if(pid=fork())exit(0);//是父进程,结束父进程?else if(pid< 0)exit(1);//fork失败,退出?//是第一子进程,后台继续执行?setsid();//第一子进程成为新的会话组长和进程组长?
//并与控制终端分离?chdir("/tmp");//改变工作目录到/tmp?umask(0);//重设文件创建掩模?for(i=0;i< NOFILE;++i)//关闭打开的文件描述符?close(i);return;
}

2. 确认制定网口是否存在?

要确认指定网口是否存在,主要通过/proc/net/dev 目录下是否有该网口信息:

peng@ubuntu:~$ cat /proc/net/dev
Inter-|   Receive                                                |  Transmitface |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressedlo:   26163     292    0    0    0     0          0         0    26163     292    0    0    0     0       0          0eth0: 285444708  243273    0    0    0     0          0         0 91828270   88660    0    0    0     0       0          0

如何用C语言实现检测指定网口,可以参考下面文章:

《简简单单教你如何用C语言列举当前所有网口!》

参考代码:

static char * interface_name_cut (char *buf, char **name)
{char *stat;/* Skip white space.  Line will include header spaces. */while (*buf == ' ')buf++;*name = buf;/* Cut interface name. */stat = strrchr (buf, ':');*stat++ = '\0';return stat;
}
/*
return value:1 exist 0:no
*/ 
int check_interface_fromproc(char *interface)
{FILE *fp;char buf[PROCBUFSIZ];struct interface *ifp;char *name;/* Open /proc/net/dev. */fp = fopen (_PATH_PROC_NET_DEV, "r");if (fp == NULL){   printf("open proc file error\n");return -1; }   /* Drop header lines. */fgets (buf, PROCBUFSIZ, fp);fgets (buf, PROCBUFSIZ, fp);/* Only allocate interface structure.  Other jobs will be done inif_ioctl.c. */while (fgets (buf, PROCBUFSIZ, fp) != NULL){   interface_name_cut (buf, &name);if(strcmp(interface,name)==0)return 1;}   fclose(fp);return 0;
}

3. 指定网口不存在

如果检测网口不存在,则需要休眠,然后继续监测/proc/net/dev文件。

4. 如果指定网口存在

则获取该网口的IP地址,然后比较是否是指定的IP地址

网卡IP地址的获取,主要通过系统调用ioctl()SIOCGIFADDR命令实现

关于如何用c语言操作网卡,擦靠下面文章

《Linux下C语言操作网卡的几个代码实例!特别实用》

参考代码如下:

int getLocalIp(const char *eth, char *ip) {struct ifreq ifr;struct sockaddr_in sin;int fd;bzero(&ifr, sizeof(ifr));if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {return -1;}strcpy(ifr.ifr_name, eth);if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) {close(fd);return -1;}memcpy(&sin, &ifr.ifr_addr, sizeof(sin));snprintf(ip, IP_SIZE, "%s", inet_ntoa(sin.sin_addr));close(fd);return 0;
}

读取的ip地址存放在参数ip指向的内存中。

5. ip地址相同

如果网卡地址与指定的ip地址相同,那么不需要修改地址,休眠一段时间(根据实际操作的频率设置时间),
然后再监测网口是否存在

6. IP地址不相同

如果ip地址不相同,则需要修改ip地址,

执行我们提前设置好的脚本if.sh即可

#!/bin/bashIPADDR=192.168.40.8
ETHPORT=eth1
echo "ethcheck set" $ETHPORT $IPADDR
echo $#
echo $0
echo $1
echo $2
if [ $# -eq 2 ];thenif [ $1 = $ETHPORT ];then echo $ETHPORTif [ $2 = "up" ];thenifconfig $ETHPORT $IPADDRsleep 1ip rule add from all lookup main pref 9000 sleep 1echo 1 > /proc/sys/net/ipv4/ip_forward iptables -Fecho "set" $ETHPORT "done"elif [ $2 = "down" ];thenecho "down"elif [ $2 = "disable" ];thenecho "disable"elif [ $2 = "error" ];thenecho "error"fifi
fi

7. 设置为开机启动

要实现开机就自动运行ifplugd,可以参考下面文章:

《安卓如何设置开机自动启动某个程序?ramdisk + init.rc给你搞定》

资料获取

完整代码,点赞留言,后台回复:eth

更多嵌入式Linux知识,请关注up主,添加我的vx!

相关文章:

自己实现一个自动检测网卡状态,并设置ip地址

阅读本文前&#xff0c;请先学习下面几篇文章 《搞懂进程组、会话、控制终端关系&#xff0c;才能明白守护进程干嘛的&#xff1f;》 《简简单单教你如何用C语言列举当前所有网口&#xff01;》 《Linux下C语言操作网卡的几个代码实例&#xff01;特别实用》 《安卓如何设置…...

【Linux】进程程序替换

文章目录 替换原理站在进程的角度站在程序的角度初体验及理解原理 替换函数函数解释命名理解exec系列函数与main函数之间的关系在一个程序中调用我们自己写的程序 替换原理 创建子进程的目的是什么&#xff1f; ->想让子进程执行父进程代码的一部分 执行父进程对应的磁盘代码…...

项目构建工具maven的基本配置+idea 中配置 maven

&#x1f451; 博主简介&#xff1a;知名开发工程师 &#x1f463; 出没地点&#xff1a;北京 &#x1f48a; 2023年目标&#xff1a;成为一个大佬 ——————————————————————————————————————————— 版权声明&#xff1a;本文为原创文…...

【解密ChatGPT】:从过去到未来,揭示其发展与变革

&#x1f38a;专栏【ChatGPT】 &#x1f33a;每日一句&#xff1a;天行健,君子以自强不息,地势坤,君子以厚德载物 ⭐欢迎并且感谢大家指出我的问题 文章目录 一、ChatGPT的发展历程 二、ChatGPT的技术原理 三、ChatGPT的应用场景 四、ChatGPT的未来趋势 五、总结 引言:随着…...

系统架构设计】计算机公共基础知识: 5 数学与经济管理

一 运筹方法 1 线性规划 线性规划问题的数学模型通常由线性目标函数、线性约束条件、变量非负条件组成,特点如下: (1)线性规划的可行解域是由一组线性约束条件形成的。 (2)如果存在两个最优解,则连接这两点的线段内所有的点都是最优解,而线段两端延长线上可能会超出…...

Visual Studio 2019光标变成灰色方块问题

文章目录 Visual Studio 2019光标变成灰色方块问题问题描述解决方案 Visual Studio 2019光标变成灰色方块问题 问题描述 单击和双击都无法选中单词&#xff0c;总是选择整行或者是当前光标处的前几个字符一起选中&#xff0c;没有规则&#xff0c;貌似选择单词复制&#xff0…...

C++ http协议POST body raw 字段向服务器发送请求

环境&#xff1a;ubuntu系统c使用http协议不是很方便&#xff0c;通过curl库我们可以很方便使用http协议&#xff0c;由于我的请求方式比较特殊&#xff0c;在网上没有找到相关的资料&#xff0c;之前使用python实现过一版&#xff0c;但是当设备数量超过100台时&#xff0c;程…...

通过migrate命令实现两个redis实例之间的数据迁移

本文适用于将源服务器的redis实例的key的数据迁移到其他服务器的redis实例 一、migrate简介&#xff1a; migrate用于在Redis实例间进行数据迁移&#xff0c;实际上migrate命令是将dump、restore、del三个命令进行组合&#xff0c;从而简化了操作流程。migrate命令具有原子性&…...

Unity 判断两个UI是否相交

今天碰到要判断两个UI是否相交的交互。 尝试了下&#xff0c;发现有两个方法都成功了。 1、使用Collider2D组件 分别创建两个Image组件&#xff0c;并且添加Collider2D组件&#xff0c;其中一个还要添加Rigidbody2D组件&#xff0c;如下图&#xff1a; 然后创建个判断脚本“…...

swoole process 消息通信

swoole文档&#xff1a;Swoole 文档 process子进程和父进程之间通信&#xff0c;依靠监听。子进程和父进程分别做监听。父进程写入信息&#xff0c;子进程监听接收。子进程向父进程写入&#xff0c;调用父进程监听。 子进程向父进程写入信息有两种方式&#xff0c;一种调用wr…...

uniapp跳转方式

UniApp 是一个基于 Vue.js 的跨平台开发框架&#xff0c;可以同时构建 iOS、Android、H5 和小程序等多个平台的应用。在 UniApp 中&#xff0c;我们可以使用以下几种方式进行页面之间的跳转&#xff1a; 使用 uni.navigateTo 方法&#xff1a;该方法可以在当前页面打开新的页面…...

六大排序算法:插入、选择、冒泡、快排、希尔、归并

1、插入排序 解析&#xff1a;第一个元素设定为已经排好序&#xff0c;依次选择后续的元素插入到已经排好序的组内进行排序。 图示&#xff1a; 代码&#xff1a; public static void insertionSort(int[] arr) {int n arr.length;for (int i 1; i < n; i) {int key a…...

短信登录实现(黑马点评为例)

文章目录 前言一、隐藏用户敏感信息二、短信验证登录、注册1.流程2.代码3.使用redis优化解决代码 二、登录拦截&#xff08;校验&#xff09;1.流程2.代码 总结 前言 短信登录核心知识 首先黑马点评这个短信登录是一伪验证&#xff0c;即后台调用工具类随机生成六位数字。 1.R…...

【uniapp】签名组件,兼容vue2vue3

网上找了个源码改吧改吧&#xff0c;清除了没用的功能和兼容性&#xff0c;基于uniapp开发的 样子 vue2 使用方法&#xff0c;具体的可以根据业务自行修改 <signature ref"signature" width"100%" height"410rpx"></signature>confi…...

初步利用Ansible实现批量服务器自动化管理

1.Ansible介绍 Ansible是一款开源的自动化运维工具, 在2012年由Michael DeHaan创建, 现在由Red Hat维护。Ansible是基于Python开发的,采用YAML语言编写自动化脚本playbook, 可以在Linux、Unix等系统上运行, 通过SSH协议管理节点, 无需在被管理节点安装agent。Ansible以其简单、…...

网络安全和隐私保护技术

一、定义 网络安全和隐私保护技术是指在互联网和其他网络环境中&#xff0c;通过技术手段保护网络系统、网络数据和用户隐私免于受到恶意攻击、非法访问、窃取或滥用。网络安全和隐私保护技术是保护网络安全和用户隐私的重要手段&#xff0c;是保障互联网和其他网络环境正常运…...

保险行业采购管理痛点及解决方案(数智化采购系统)

随着社会发展&#xff0c;个人和企业有了更多的金融保险需求。对于金融保险公司而言&#xff0c;需要在采购合规的基础上&#xff0c;基于数智化能力&#xff0c;让经营变得更加高效和智能。 1、围绕重点领域&#xff0c;业务加速布局。 保险行业结合自身业务经营重点&#x…...

光学仿真 | 仿真推动以人类视觉感知为本的汽车显示设计

如果产品设计无法使终端用户产生共鸣&#xff0c;就不会存在卓越的工程设计。您可以设计一种结构坚固的方向盘&#xff0c;但如果它被放在错误的位置&#xff0c;就无法实现其用于转向的主要目的。 同样&#xff0c;在围绕人类视觉进行设计时&#xff0c;显示器其实无需具备尽…...

判断两个对象是否不相等operator.ne()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 判断两个对象是否不相等 operator.ne() 选择题 下列代码执行输出的结果是? import operator print("【执行】operator.ne(8,8)") print(operator.ne(8,8)) print("【执行】…...

2023年云计算发展趋势:生活的智能未来

目录 引言1 智能家居的崭新时代2 无人驾驶的崭新时代3 虚拟现实的扩展与改进4 人工智能的综合应用5 云计算的可持续性结语 引言 时光荏苒&#xff0c;科技的飞速发展已经成为当今社会的标志之一。在这个数字化时代&#xff0c;云计算已经成为推动技术革新和生活方式改变的关键…...

seo优化服务价格一般是多少_网站快速排名对网站访问量有什么影响

SEO优化服务价格一般是多少_网站快速排名对网站访问量有什么影响 在当前数字化经济的浪潮中&#xff0c;网站的流量和排名直接决定了企业的成功与否。SEO优化服务价格一般是多少&#xff1f;更重要的是&#xff0c;网站快速排名对网站访问量有什么影响呢&#xff1f;这两个问题…...

Llama-3.2V-11B-cot效果展示:识别艺术海报中风格与主题逻辑断层

Llama-3.2V-11B-cot效果展示&#xff1a;识别艺术海报中风格与主题逻辑断层 1. 工具介绍 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具。该工具针对双卡4090环境进行了深度优化&#xff0c;特别适合需要分析复杂视觉内容的场景&…...

OpenClaw备份策略大全:千问3.5-27B智能识别关键文件自动归档

OpenClaw备份策略大全&#xff1a;千问3.5-27B智能识别关键文件自动归档 1. 为什么需要智能备份方案&#xff1f; 上周我的移动硬盘突然罢工&#xff0c;导致三个月的项目文档全部丢失。这次惨痛经历让我意识到&#xff1a;传统备份方案只是机械地复制文件&#xff0c;既占用…...

Qwen3-0.6B入门实战:从镜像启动到智能问答,完整流程解析

Qwen3-0.6B入门实战&#xff1a;从镜像启动到智能问答&#xff0c;完整流程解析 1. Qwen3-0.6B简介 Qwen3&#xff08;千问3&#xff09;是阿里巴巴集团开源的新一代通义千问大语言模型系列&#xff0c;涵盖6款密集模型和2款混合专家&#xff08;MoE&#xff09;架构模型。Qw…...

忍者像素绘卷惊艳作品集:16-Bit复古美学+火之意志主题像素艺术展

忍者像素绘卷惊艳作品集&#xff1a;16-Bit复古美学火之意志主题像素艺术展 1. 像素艺术的革命性突破 忍者像素绘卷代表了当前像素艺术生成技术的巅峰之作。这款基于Z-Image-Turbo深度优化的图像生成工作站&#xff0c;成功将传统忍者文化与现代AI技术完美融合&#xff0c;创…...

Linux中以其它用户身份执行脚本或命令的全总结

Linux中以其他用户身份执行命令或脚本是一个常见的需求,最近工作中碰到了这个需求,在这里简单总结一下.假如我们在root用户下想以其它用户(例如oracle,mysql)身份执行一些脚本或命令,那么有哪一些方法呢?su命令(switch user)su命令的使用方式有两种, 如下所示:切换用户只执行一…...

在Linux中编写shell脚本监听指定端口的实现方式

在Linux中&#xff0c;你可以编写一个shell脚本来监听指定端口。以下是几种实现方式&#xff1a;方法1&#xff1a;使用nc&#xff08;netcat&#xff09;的简单监听脚本1234567891011121314151617181920212223#!/bin/bash# 文件名&#xff1a;port_listener.sh# 检查参数if [ …...

微信聊天记录备份工具:守护数字记忆的安全防线

微信聊天记录备份工具&#xff1a;守护数字记忆的安全防线 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 在数字化时代&#xff0c;微信聊天记录已成为我们生活与工作的…...

Windows 11上保姆级教程:用Ollama本地部署DeepSeek-R1 8B,再也不用担心API费用和网络延迟了

Windows 11本地AI部署实战&#xff1a;OllamaDeepSeek-R1 8B全流程指南 在AI技术快速发展的今天&#xff0c;越来越多的开发者和中小企业开始关注如何在本地环境中部署和运行大型语言模型。对于预算有限但对数据隐私有高要求的团队来说&#xff0c;本地部署不仅能显著降低成本&…...

HP20x气压传感器Arduino驱动深度解析

1. Grove Barometer HP20x 高精度气压/温度/海拔传感器驱动深度解析1.1 项目定位与工程价值Grove Barometer HP20x 是 Seeed Studio 推出的基于 HP206C&#xff08;或兼容型号 HP203B/HP202C&#xff09;高精度气压传感芯片的模块化传感器。该驱动库并非简单封装&#xff0c;而…...