0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

自己如何实现一个简化的程序ethcheck?

dyquk4xk2p3d 来源:良许Linux 2023-11-30 09:35 次阅读

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

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

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

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

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

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

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

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

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

rk3568所有网口:

rk3568_r:/system#ifconfig-a
loLinkencap:LocalLoopback
inetaddr:127.0.0.1Mask:255.0.0.0
inet6addr:::1/128Scope:Host
UPLOOPBACKRUNNINGMTU:65536Metric:1
RXpackets:0errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:0TXbytes:0

dummy0Linkencap:EthernetHWaddrfa6c1b:7d
inet6addr:fe80:6cff1b7d/64Scope:Link
UPBROADCASTRUNNINGNOARPMTU:1500Metric:1
RXpackets:0errors:0dropped:0overruns:0frame:0
TXpackets:8errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:0TXbytes:560

sit0Linkencap:IPv6-in-IPv4
NOARPMTU:1480Metric:1
RXpackets:0errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:0TXbytes:0

ip6tnl0Linkencap:UNSPEC
NOARPMTU:1452Metric:1
RXpackets:0errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:0TXbytes:0

eth1Linkencap:EthernetHWaddr5a63dd:0bDriverrk_gmac-dwmac
UPBROADCASTMULTICASTMTU:1500Metric:1
RXpackets:0errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:0TXbytes:0
Interrupt:51

ip_vti0Linkencap:UNSPEC
NOARPMTU:1480Metric:1
RXpackets:0errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:0TXbytes:0

eth0Linkencap:EthernetHWaddr5e63dd:0bDriverrk_gmac-dwmac
UPBROADCASTMULTICASTMTU:1500Metric:1
RXpackets:0errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:0TXbytes:0
Interrupt:38

ip6_vti0Linkencap:UNSPEC
NOARPMTU:1364Metric:1
RXpackets:0errors:0dropped:0overruns:0frame:0
TXpackets:0errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RXbytes:0TXbytes:0

二、程序设计

0.程序框图

8ab7bcd0-8f10-11ee-939d-92fbcf53809c.png

1. 设置程序为守护进程

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

参考代码如下:

voidinit_daemon(void)
{
intpid;
inti;

if(pid=fork())
exit(0);//是父进程,结束父进程?

elseif(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|Transmit
face|bytespacketserrsdropfifoframecompressedmulticast|bytespacketserrsdropfifocollscarriercompressed
lo:2616329200000026163292000000
eth0:2854447082432730000009182827088660000000

参考代码:

staticchar*interface_name_cut(char*buf,char**name)
{
char*stat;
/*Skipwhitespace.Linewillincludeheaderspaces.*/
while(*buf=='')
buf++;
*name=buf;
/*Cutinterfacename.*/
stat=strrchr(buf,':');
*stat++='�';
returnstat;
}
/*
returnvalue:1exist0:no
*/
intcheck_interface_fromproc(char*interface)
{
FILE*fp;
charbuf[PROCBUFSIZ];
structinterface*ifp;
char*name;

/*Open/proc/net/dev.*/
fp=fopen(_PATH_PROC_NET_DEV,"r");
if(fp==NULL)
{
printf("openprocfileerror
");
return-1;
}

/*Dropheaderlines.*/
fgets(buf,PROCBUFSIZ,fp);
fgets(buf,PROCBUFSIZ,fp);

/*Onlyallocateinterfacestructure.Otherjobswillbedonein
if_ioctl.c.*/
while(fgets(buf,PROCBUFSIZ,fp)!=NULL)
{
interface_name_cut(buf,&name);
if(strcmp(interface,name)==0)
return1;
}
fclose(fp);
return0;
}

3. 指定网口不存在

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

4. 如果指定网口存在

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

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

参考代码如下:

intgetLocalIp(constchar*eth,char*ip){
structifreqifr;
structsockaddr_insin;
intfd;
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/bash

IPADDR=192.168.40.8
ETHPORT=eth1
echo"ethcheckset"$ETHPORT$IPADDR
echo$#
echo$0
echo$1
echo$2
if[$#-eq2];then
if[$1=$ETHPORT];then
echo$ETHPORT
if[$2="up"];then
ifconfig$ETHPORT$IPADDR
sleep1
ipruleaddfromalllookupmainpref9000
sleep1
echo1>/proc/sys/net/ipv4/ip_forward
iptables-F
echo"set"$ETHPORT"done"
elif[$2="down"];then
echo"down"
elif[$2="disable"];then
echo"disable"
elif[$2="error"];then
echo"error"
fi
fi
fi





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • USB接口
    +关注

    关注

    9

    文章

    701

    浏览量

    55634
  • RK3568
    +关注

    关注

    4

    文章

    514

    浏览量

    5031
收藏 人收藏

    评论

    相关推荐

    自己做的小抽奖程序

    自己做的小抽奖程序,功能比较单,获奖的名字没有移除,所以不排除重复的可能。另外加载的数据只能是文本文件,但是可以有excel文件转换。
    发表于 12-05 22:40

    自己编的程序,学习用的

    自己编的程序,学习用的。。。。
    发表于 05-29 08:11

    能在138控制部分简化程序吗?

    刚学习STM32,想用片164芯片和片138控制64LED,实现跑马灯效果,以下是自己写的程序
    发表于 10-14 22:20

    分享自己做的oled屏贪吃蛇程序

    分享自己做的oled屏贪吃蛇程序程序是用stm32写的,但是移植起来却特别简单,oled是iic的,算是满足
    发表于 07-10 11:08

    想要自己实现bootloader,APROM中程序如何实现跳转,中断向量表如何设置?

    我要自己实现bootloader,bootloader在M487的APROM里面,APP也在APROM里面,如何实现从bootloade
    发表于 06-27 08:39

    用FPGA实现DES算法的密钥简化算法

    介绍DES的密钥算法,提出种用预计算简化密钥计算的方法并公布了预计算的C语言源程序。这种方法对 DES的硬件实现有非常好的简化效果。
    发表于 04-07 09:41 14次下载

    程序运行之后把自己删除的方法

      近日看到网友询问如何实现程序运行之后把自己删除的方法,不知大家对木马甚么的兴趣实在太浓,还是想要这样的效果:用户只要运行程序,可执行文
    发表于 08-30 11:38 2799次阅读

    利用USBXpress开发包简化应用程序实现USB通信设计

    传统的USB设备驱动程序编写异常复杂,程序员往往很难入手。SILICON Laboratories公司提供的USBXpress开发包大大简化了USB通信的应用和相关驱动程序的开发,只要
    的头像 发表于 01-14 08:02 2615次阅读
    利用USBXpress开发包<b class='flag-5'>简化</b>应用<b class='flag-5'>程序</b><b class='flag-5'>实现</b>USB通信设计

    自己DIY制作电流电压表的程序些文件免费下载

    本文档的主要内容详细介绍的是自己DIY制作电流电压表的程序些文件免费下载。
    发表于 05-23 17:42 57次下载
    <b class='flag-5'>自己</b>DIY制作<b class='flag-5'>一</b><b class='flag-5'>个</b>电流电压表的<b class='flag-5'>程序</b>和<b class='flag-5'>一</b>些文件免费下载

    如何自己制作单片机开发板

    之所以做这个的初衷是应为自己买的51 开发板已经下载不了程序了,所以想做一个下载程序的最小系统,可是做到后来,就觉着这么大块万用板只是做
    发表于 09-02 16:43 14次下载
    如何<b class='flag-5'>自己</b>制作<b class='flag-5'>一</b><b class='flag-5'>个</b>单片机开发板

    使用单片机实现LED隔程序和仿真资料免费下载

    本文档的主要内容详细介绍的是使用单片机实现LED隔程序和仿真资料免费下载。
    发表于 03-18 17:11 8次下载

    程序是如何运行起来的

    问题。 还是和之前样,我画了程序运行的全景图,在上图中,程序运行所经历的代码段,我都标
    的头像 发表于 10-12 17:48 3293次阅读
    <b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>程序</b>是如何运行起来的

    stm32单片机如何实现按键切换两程序

    stm32单片机如何实现按键切换两程序? 作为款功能强大的微控制器,STM32单片机可以
    的头像 发表于 09-14 14:22 6096次阅读

    如何编写自己的 starter

    前面给大家介绍了 SpringBoot 的自动装配功能,相信大家对自动装配都有了很好的理解,那么今天阿粉通过示例来给大家演示下如何编写
    的头像 发表于 10-08 14:42 913次阅读
    如何编写<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>自己</b>的 starter

    如何自己搭建服务器?

    如何自己搭建服务器?自己搭建服务器涉及到硬件和软件两
    的头像 发表于 12-12 16:52 3825次阅读