一、usb網(wǎng)卡應(yīng)該如何實(shí)現(xiàn)?
前文講了如何利用開源軟件ifplugd實(shí)現(xiàn)監(jiān)測(cè)網(wǎng)口狀態(tài)變化,
ifplugd的確可以實(shí)現(xiàn)監(jiān)測(cè)網(wǎng)卡的狀態(tài),并執(zhí)行相應(yīng)腳本,
但是有個(gè)前提,就是網(wǎng)口已經(jīng)注冊(cè)到系統(tǒng)中,即用ifconfig -a能查看到
如何是usb網(wǎng)卡這種設(shè)備,在插入usb口之后網(wǎng)口設(shè)備才會(huì)注冊(cè),
使用過(guò)程中可能隨時(shí)會(huì)拔掉usb網(wǎng)卡,
那么這種情況下,要想設(shè)置usb網(wǎng)卡,那么就就需要修改ifplugd程序。
為了方便大家理解,本文給大家講解如何自己實(shí)現(xiàn)一個(gè)簡(jiǎn)化的程序ethcheck,
可以實(shí)現(xiàn)自動(dòng)監(jiān)測(cè)網(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è)計(jì)
0.程序框圖
1. 設(shè)置程序?yàn)槭刈o(hù)進(jìn)程
因?yàn)樵摮绦蜃罱K要在后臺(tái)執(zhí)行,并且常駐內(nèi)存,所以必須將該進(jìn)程設(shè)置為守護(hù)進(jìn)程
參考代碼如下:
voidinit_daemon(void) { intpid; inti; if(pid=fork()) exit(0);//是父進(jìn)程,結(jié)束父進(jìn)程? elseif(pid0) ??exit(1);//fork失敗,退出? ? //是第一子進(jìn)程,后臺(tái)繼續(xù)執(zhí)行? ?setsid();//第一子進(jìn)程成為新的會(huì)話組長(zhǎng)和進(jìn)程組長(zhǎng)? //并與控制終端分離? ?chdir("/tmp");//改變工作目錄到/tmp? ?umask(0);//重設(shè)文件創(chuàng)建掩模? ? ?for(i=0;i
2. 確認(rèn)制定網(wǎng)口是否存在?
要確認(rèn)指定網(wǎng)口是否存在,主要通過(guò)/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)口不存在
如果檢測(cè)網(wǎng)口不存在,則需要休眠,然后繼續(xù)監(jiān)測(cè)/proc/net/dev文件。
4. 如果指定網(wǎng)口存在
則獲取該網(wǎng)口的IP地址,然后比較是否是指定的IP地址
網(wǎng)卡IP地址的獲取,主要通過(guò)系統(tǒng)調(diào)用ioctl()的 SIOCGIFADDR命令實(shí)現(xiàn)
參考代碼如下:
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地址存放在參數(shù)ip指向的內(nèi)存中。
5. ip地址相同
如果網(wǎng)卡地址與指定的ip地址相同,那么不需要修改地址,休眠一段時(shí)間(根據(jù)實(shí)際操作的頻率設(shè)置時(shí)間),然后再監(jiān)測(cè)網(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
審核編輯:劉清
-
USB接口
+關(guān)注
關(guān)注
9文章
707瀏覽量
56965 -
RK3568
+關(guān)注
關(guān)注
5文章
584瀏覽量
6396
發(fā)布評(píng)論請(qǐng)先 登錄
自己做的一個(gè)小抽獎(jiǎng)程序
能在138控制部分簡(jiǎn)化下程序嗎?
分享一個(gè)自己做的oled屏貪吃蛇程序
想要自己實(shí)現(xiàn)一個(gè)bootloader,APROM中程序如何實(shí)現(xiàn)跳轉(zhuǎn),中斷向量表如何設(shè)置?
用FPGA實(shí)現(xiàn)DES算法的密鑰簡(jiǎn)化算法
程序運(yùn)行之后把自己刪除的方法
利用USBXpress開發(fā)包簡(jiǎn)化應(yīng)用程序實(shí)現(xiàn)USB通信設(shè)計(jì)

自己DIY制作一個(gè)電流電壓表的程序和一些文件免費(fèi)下載

如何自己制作一個(gè)單片機(jī)開發(fā)板

使用單片機(jī)實(shí)現(xiàn)LED隔一個(gè)亮一個(gè)的程序和仿真資料免費(fèi)下載
一個(gè)程序是如何運(yùn)行起來(lái)的

stm32單片機(jī)如何實(shí)現(xiàn)一個(gè)按鍵切換兩個(gè)程序?
如何編寫一個(gè)自己的 starter

評(píng)論