0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

自己如何實現(xiàn)一個簡化的程序ethcheck?

dyquk4xk2p3d ? 來源:良許Linux ? 2023-11-30 09:35 ? 次閱讀

一、usb網(wǎng)卡應該如何實現(xiàn)?

前文講了如何利用開源軟件ifplugd實現(xiàn)監(jiān)測網(wǎng)口狀態(tài)變化,

ifplugd的確可以實現(xiàn)監(jiān)測網(wǎng)卡的狀態(tài),并執(zhí)行相應腳本,

但是有個前提,就是網(wǎng)口已經(jīng)注冊到系統(tǒng)中,即用ifconfig -a能查看到

如何是usb網(wǎng)卡這種設(shè)備,在插入usb口之后網(wǎng)口設(shè)備才會注冊,

使用過程中可能隨時會拔掉usb網(wǎng)卡,

那么這種情況下,要想設(shè)置usb網(wǎng)卡,那么就就需要修改ifplugd程序。

為了方便大家理解,本文給大家講解如何自己實現(xiàn)一個簡化的程序ethcheck

可以實現(xiàn)自動監(jiān)測網(wǎng)卡是否存在

rk3568所有網(wǎng)口:

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

二、程序設(shè)計

0.程序框圖

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

1. 設(shè)置程序為守護進程

因為該程序最終要在后臺執(zhí)行,并且常駐內(nèi)存,所以必須將該進程設(shè)置為守護進程

參考代碼如下:

voidinit_daemon(void)
{
intpid;
inti;

if(pid=fork())
exit(0);//是父進程,結(jié)束父進程?

elseif(pid

2. 確認制定網(wǎng)口是否存在?

要確認指定網(wǎng)口是否存在,主要通過/proc/net/dev 目錄下是否有該網(wǎng)口信息

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. 指定網(wǎng)口不存在

如果檢測網(wǎng)口不存在,則需要休眠,然后繼續(xù)監(jiān)測/proc/net/dev文件。

4. 如果指定網(wǎng)口存在

則獲取該網(wǎng)口的IP地址,然后比較是否是指定的IP地址

網(wǎng)卡IP地址的獲取,主要通過系統(tǒng)調(diào)用ioctl()的 SIOCGIFADDR命令實現(xiàn)

參考代碼如下:

intgetLocalIp(constchar*eth,char*ip){
structifreqifr;
structsockaddr_insin;
intfd;
bzero(&ifr,sizeof(ifr));
if((fd=socket(AF_INET,SOCK_STREAM,0))

讀取的ip地址存放在參數(shù)ip指向的內(nèi)存中。

5. ip地址相同

如果網(wǎng)卡地址與指定的ip地址相同,那么不需要修改地址,休眠一段時間(根據(jù)實際操作的頻率設(shè)置時間),然后再監(jiān)測網(wǎng)口是否存在

6. IP地址不相同

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

執(zhí)行我們提前設(shè)置好的腳本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





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • USB接口
    +關(guān)注

    關(guān)注

    9

    文章

    691

    瀏覽量

    55373
  • RK3568
    +關(guān)注

    關(guān)注

    4

    文章

    479

    瀏覽量

    4723
收藏 人收藏

    評論

    相關(guān)推薦

    自己做的小抽獎程序

    自己做的小抽獎程序,功能比較單,獲獎的名字沒有移除,所以不排除重復的可能。另外加載的數(shù)據(jù)只能是文本文件,但是可以有excel文件轉(zhuǎn)換。
    發(fā)表于 12-05 22:40

    自己編的程序,學習用的

    自己編的程序,學習用的。。。。
    發(fā)表于 05-29 08:11

    能在138控制部分簡化程序嗎?

    剛學習STM32,想用片164芯片和片138控制64LED,實現(xiàn)跑馬燈效果,以下是自己寫的程序
    發(fā)表于 10-14 22:20

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

    分享自己做的oled屏貪吃蛇程序,程序是用stm32寫的,但是移植起來卻特別簡單,oled是iic的,算是滿足
    發(fā)表于 07-10 11:08

    想要自己實現(xiàn)bootloader,APROM中程序如何實現(xiàn)跳轉(zhuǎn),中斷向量表如何設(shè)置?

    我要自己實現(xiàn)bootloader,bootloader在M487的APROM里面,APP也在APROM里面,如何實現(xiàn)從bootloade
    發(fā)表于 06-27 08:39

    用FPGA實現(xiàn)DES算法的密鑰簡化算法

    介紹DES的密鑰算法,提出種用預計算簡化密鑰計算的方法并公布了預計算的C語言源程序。這種方法對 DES的硬件實現(xiàn)有非常好的簡化效果。
    發(fā)表于 04-07 09:41 ?14次下載

    程序運行之后把自己刪除的方法

      近日看到網(wǎng)友詢問如何實現(xiàn)程序運行之后把自己刪除的方法,不知大家對木馬甚么的興趣實在太濃,還是想要這樣的效果:用戶只要運行程序,可執(zhí)行文
    發(fā)表于 08-30 11:38 ?2727次閱讀

    利用USBXpress開發(fā)包簡化應用程序實現(xiàn)USB通信設(shè)計

    傳統(tǒng)的USB設(shè)備驅(qū)動程序編寫異常復雜,程序員往往很難入手。SILICON Laboratories公司提供的USBXpress開發(fā)包大大簡化了USB通信的應用和相關(guān)驅(qū)動程序的開發(fā),只要
    的頭像 發(fā)表于 01-14 08:02 ?2521次閱讀
    利用USBXpress開發(fā)包<b class='flag-5'>簡化</b>應用<b class='flag-5'>程序</b><b class='flag-5'>實現(xiàn)</b>USB通信設(shè)計

    自己DIY制作電流電壓表的程序些文件免費下載

    本文檔的主要內(nèi)容詳細介紹的是自己DIY制作電流電壓表的程序些文件免費下載。
    發(fā)表于 05-23 17:42 ?54次下載
    <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>些文件免費下載

    如何自己制作單片機開發(fā)板

    之所以做這個的初衷是應為自己買的51 開發(fā)板已經(jīng)下載不了程序了,所以想做一個下載程序的最小系統(tǒng),可是做到后來,就覺著這么大塊萬用板只是做
    發(fā)表于 09-02 16:43 ?14次下載
    如何<b class='flag-5'>自己</b>制作<b class='flag-5'>一</b><b class='flag-5'>個</b>單片機開發(fā)板

    使用單片機實現(xiàn)LED隔程序和仿真資料免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用單片機實現(xiàn)LED隔程序和仿真資料免費下載。
    發(fā)表于 03-18 17:11 ?8次下載

    程序是如何運行起來的

    問題。 還是和之前樣,我畫了程序運行的全景圖,在上圖中,程序運行所經(jīng)歷的代碼段,我都標
    的頭像 發(fā)表于 10-12 17:48 ?3168次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>程序</b>是如何運行起來的

    stm32單片機如何實現(xiàn)按鍵切換兩程序?

    stm32單片機如何實現(xiàn)按鍵切換兩程序? 作為款功能強大的微控制器,STM32單片機可以
    的頭像 發(fā)表于 09-14 14:22 ?5528次閱讀

    如何編寫自己的 starter

    前面給大家介紹了 SpringBoot 的自動裝配功能,相信大家對自動裝配都有了很好的理解,那么今天阿粉通過示例來給大家演示下如何編寫
    的頭像 發(fā)表于 10-08 14:42 ?756次閱讀
    如何編寫<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>自己</b>的 starter

    如何自己搭建服務器?

    如何自己搭建服務器?自己搭建服務器涉及到硬件和軟件兩
    的頭像 發(fā)表于 12-12 16:52 ?3540次閱讀