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

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

3天内不再提示

usb网卡应该如何实现?

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

一、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

审核编辑:汤梓红

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

    关注

    0

    文章

    204

    浏览量

    15661
  • usb
    usb
    +关注

    关注

    59

    文章

    7436

    浏览量

    258234
  • 网卡
    +关注

    关注

    2

    文章

    285

    浏览量

    27090
  • ip地址
    +关注

    关注

    0

    文章

    240

    浏览量

    16743

原文标题:自己实现一个自动检测网卡状态,并设置ip地址,源码见文章底部

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    USB网卡方案和USB无线网卡方案?

    求购USB网卡方案和USB无线网卡方案?vcd8029@126.com
    发表于 05-03 09:43

    USB无线网卡设计与实现高手请进

    USB 无线网卡的做好后要不要写软件到卡上,还有无线网卡改频是驱动上改还是硬件上改,如题。。。有谁上个PCB给大家研究一下、。
    发表于 07-16 00:31

    如何获取USB网卡中的数据?

    上位机通过LabVIEW采集USB无线网卡中的数据,可是一直没有采集到。现在我想通过别的方法,验证网卡中是否有数据,如果有,那就是LabVIEW的问题了。哪位高手知道,怎样捕捉网卡中的
    发表于 09-28 16:27

    USB无线网卡(EDUP)配置

    USB无线网卡(EDUP)配置 连接WiFi 嵌入式 Debian 9.5系统*1.准备条件硬件:beaglebone black 开发板EDUPUSB无线网卡 嵌入式系统为:debian 9.5
    发表于 12-16 08:32

    st268 usb网卡驱动程序下载

    方便随身携带的精巧USB网卡(蓝)
    发表于 09-28 15:17 121次下载

    usb网卡驱动程序下载(万能全集)

    usb网卡驱动程序:ADM8511 USB网卡驱动程序ADM8515 USB网卡驱动程序AS26
    发表于 09-28 15:40 4202次下载
    <b class='flag-5'>usb</b><b class='flag-5'>网卡</b>驱动程序下载(万能全集)

    usb ethernet网卡驱动

    usb ethernet网卡驱动免费下载。。
    发表于 03-16 08:59 286次下载

    rtl8150 usb网卡驱动下载

    rtl8150 usb网卡驱动下载,最新版哦。
    发表于 03-16 09:00 13次下载

    VIA威盛 VT6656无线USB网卡驱动

    VIA威盛 VT6656无线USB网卡驱动 网卡驱动安装程序
    发表于 11-29 12:06 38次下载

    150M无线USB网卡 FAST FW150U仅80元

    150M无线USB网卡 FAST FW150U仅80元 无线上网越来越成为一种时尚,无线网卡越来越流行,而USB接口的无线网卡则更为方便使
    发表于 04-28 10:26 1729次阅读

    USB无线网卡电路图

    本站给大家提供USB无线网卡电路图,希望能帮助到大家
    发表于 05-24 16:54 1976次下载
    <b class='flag-5'>USB</b>无线<b class='flag-5'>网卡</b>电路图

    瑞昱150M无线USB网卡解决方案下载

    瑞昱150M无线USB网卡解决方案
    发表于 02-26 17:21 7次下载

    带有延长线的USB网卡的四大优势

    一个小小的USB网卡,也能玩出各种花样。可不嘛!市面上USB无线网卡的款式层出不穷,价格也从几十上百不等。但不难发现,比较常规的款式一般是USB
    发表于 07-13 09:52 2452次阅读

    友讯发布2.5千兆USB有线网卡

    继推出全球首款USB无线Wi-Fi 6网卡后,友讯(D-Link)日前也在CES 2021上对外发布了旗下首款2.5Gbps USB有线网卡DUB-E250,号称是市面目前最袖珍的解决
    发表于 01-14 16:35 1023次阅读

    硕盟usb3.0转rj45千兆以太网免驱网卡

    和稳定性十分强大,支持USB3.0、千兆以太网标准,同时兼容USB1.1/2.0、百兆以太网。传输快速稳定,传输速率可达1Gbps,实现满速传输,在兼容性和稳定性方面远超普通网卡。该
    的头像 发表于 11-11 15:37 1755次阅读