一、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.程序框图
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文章
699浏览量
55558 -
RK3568
+关注
关注
4文章
492浏览量
4913
发布评论请先 登录
相关推荐
评论