网站关键词seo优化公司,改进网站的建议,专门型网站,平度网站建设阅读本文前#xff0c;请先学习下面几篇文章 
《搞懂进程组、会话、控制终端关系#xff0c;才能明白守护进程干嘛的#xff1f;》 
《简简单单教你如何用C语言列举当前所有网口#xff01;》 
《Linux下C语言操作网卡的几个代码实例#xff01;特别实用》 
《安卓如何设置…阅读本文前请先学习下面几篇文章 
《搞懂进程组、会话、控制终端关系才能明白守护进程干嘛的》 
《简简单单教你如何用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(pidfork())exit(0);//是父进程结束父进程?else if(pid 0)exit(1);//fork失败退出?//是第一子进程后台继续执行?setsid();//第一子进程成为新的会话组长和进程组长?
//并与控制终端分离?chdir(/tmp);//改变工作目录到/tmp?umask(0);//重设文件创建掩模?for(i0;i NOFILE;i)//关闭打开的文件描述符?close(i);return;
}2. 确认制定网口是否存在 
要确认指定网口是否存在主要通过/proc/net/dev 目录下是否有该网口信息 
pengubuntu:~$ 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/bashIPADDR192.168.40.8
ETHPORTeth1
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 doneelif [ $2  down ];thenecho downelif [ $2  disable ];thenecho disableelif [ $2  error ];thenecho errorfifi
fi7. 设置为开机启动 
要实现开机就自动运行ifplugd可以参考下面文章 
《安卓如何设置开机自动启动某个程序ramdisk  init.rc给你搞定》 
资料获取 
完整代码点赞留言后台回复eth 
更多嵌入式Linux知识请关注up主添加我的vx