自己实现一个自动检测网卡状态,并设置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!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/163910.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

王道考研--》顺序表课后习题C语言代码实现(冲刺)

考研是许多计算机科学专业学生追求高学历、寻求更好就业前景的途径。在考研过程中&#xff0c;数据结构是一个非常重要的科目&#xff0c;而代码实现题更是其中的难点之一。在这篇文章中&#xff0c;我们将探讨如何通过实现数据结构代码问题来提升考研成绩。无论您是否有编程经…

#龙迅视频转换IC LT7911D是一款高性能Type-C/DP/EDP 转MIPI®DSI/CSI/LVDS 芯片,适用于VR/显示应用。

1.说明 应用功能&#xff1a;LT7911D适用于DP1.2转MIPIDSI/MIPICSI/LVDS&#xff0c;EDP转MIPIDSI/MIPICSI/LVDS&#xff0c;TYPE-C转MIPIDSI/MIPICSI/LVDS应用方案 分辨率&#xff1a;单PORT高达4K30HZ&#xff0c;双PORT高达4K 60HZ 工作温度范围&#xff1a;−40C to 85C 产…

Java——》4种引用:强软弱虚

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

微服务项目,请求从发出到后端处理器的历程

点击登录按钮,发出 http://localhost:8803/service_6001/admin/login/in请求,这是一个由nginx配置的前端项目 查看配置文件,该条请求会被映射形成对http://localhost:51603/admin/login/in的post请求 upstream heima-admin-gateway {server localhost:51603; } server {liste…

Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出

本心、输入输出、结果 文章目录 Apple &#xff1a;苹果将在明年年底推出自己的 AI&#xff0c;预计将随 iOS 18 一起推出前言三星声称库克相关图片弘扬爱国精神 Apple &#xff1a;苹果将在明年年底推出自己的 AI&#xff0c;预计将随 iOS 18 一起推出 编辑&#xff1a;简简单…

技术分享 | 想做App测试就一定要了解的App结构

app 的结构包含了 APK 结构和 app 页面结构两个部分 APK结构 APK 是 Android Package 的缩写&#xff0c;其实就是 Android 的安装包。通过将 APK 文件直接传到 Android 模拟器或 Android 手机中执行即可安装。 APK 文件其实是 zip 格式&#xff0c;但后缀名被修改为 apk&am…

iPortal如何灵活设置用户名及密码的安全规则

作者&#xff1a;yx 目录 前言 一、配置文件介绍 1、<passwordRules>节点 注意事项&#xff1a; 2、<usernameRules>节点 二、应用实例 1、配置文件设置 2、验证扩展结果 三、结果展示 前言 SuperMap iPortal提供了扩展账户信息合规度校验规则的能力&#…

xilinx primitives(原语)

Xilinx的原语分为10类&#xff0c;包括&#xff1a;计算组件&#xff0c;IO端口组件&#xff0c;寄存器/锁存器&#xff0c;时钟组件&#xff0c;处理器组件&#xff0c;移位寄存器&#xff0c;配置和检测组件&#xff0c;RAM/ROM组件&#xff0c;Slice/CLB组件&#xff0c;G-t…

SCI论文投稿经验分享,建议收藏!

对医药学专业的学生而言&#xff0c;让自己的医学论文在SCI期刊发表关乎评优、申学&#xff0c;十分重要。笔者根据多位常笑医学网用户的SCI论文投稿经历&#xff0c;汇总了一些SCI论文投稿经验与大家分享。 投稿前的准备工作很必要 用好查刊选刊工具效率翻倍 首先&#xff0c…

Markdown写作应用推荐

MWeb Pro 是一款适用于macOS的专业Markdown写作、笔记本应用软件。喜欢写博客的朋友&#xff0c;那你一定会需要 MWeb Pro 这款软件。为您提供最佳的写作体验。 Markdown 语法支持&#xff1a; 使用 Github Flavored Markdown 语法&#xff0c;简称 GFM 语法。支持表格、TOC、…

【C++】多态 ⑬ ( 多继承中应用 “ 抽象类 “ | 接口和抽象类 | C++ 语言中接口实现 | 只定义 纯虚函数 的 抽象类作接口 | )

文章目录 一、多继承中应用 " 抽象类 "1、接口和抽象类2、编程语言对接口和多继承的支持3、C 语言中接口实现 二、代码示例 - 多继承中应用 " 抽象类 " 一、多继承中应用 " 抽象类 " 1、接口和抽象类 接口 Interface 和 抽象类 AbstractClass 都…

【owt】p2p client mfc 工程梳理

1年前构建的,已经搞不清楚了。所以梳理下,争取能用较新的webrtc版本做测试。最早肯定用这个测试跑通过 【owt】p2p Signaling Server 运行、与OWT-P2P-MFC 交互过程及信令分析官方的mfc客户端 估计是构造了多个不同的webrc版本的客户端