当前位置: 首页 > article >正文

网络配置工具类详解

CNet 网络配置工具类详解平台仅支持Linux大量使用ioctl系统调用一、概述CNet是一个纯静态方法的网络配置工具类封装了 Linux 下常用的网络操作功能类别涵盖内容IP 地址读取/设置本机 IP、子网掩码网关读取/添加/删除/设置默认网关DNS读取/写入/etc/resolv.confMAC 地址读取本机 MAC、生成随机 MAC网卡状态网线插入检测、网卡使能/禁用、接口是否存在路由 metric设置网卡路由优先级Socket 绑定将套接字绑定到指定网卡全部方法都是static无需实例化即可调用。二、头文件与依赖externC{#includestdio.h#includestring.h#includearpa/inet.h// inet_ntoa(), inet_addr()#includesys/ioctl.h// ioctl 系统调用#includenet/if.h// ifreq, IFNAMSIZ#includeunistd.h#includelinux/if.h#includelinux/ethtool.h// ETHTOOL_GLINK 网线检测#includelinux/rtnetlink.h// 路由#includenet/route.h// rtentry 路由结构#includesys/time.h#includedirent.h};核心武器是ioctl——Linux 下操作网络接口的全能接口。三、IP 地址操作3.1 整数 ↔ 字符串互转// 整数 IP网络字节序 → 字符串 192.168.1.100char*IpU32ToStr(uint32_tu32_ip);// 字符串 IP → 整数网络字节序unsignedintIpStrToU32(constchar*sz_ip);内部其实就两层皮// IpU32ToStr 内部returninet_ntoa(*(structin_addr*)u32_ip);// IpStrToU32 内部returninet_addr(sz_ip);⚠️inet_addr()在 IP 为0时返回INADDR_NONE但代码未做校验实际使用有坑。3.2 读取本机 IPboolGetLocalIp(constchar*interface_name,char*sz_ip,uint32_tu32_ip);实现套路后文类似方法都这个套路intsock_fdsocket(AF_INET,SOCK_DGRAM,0);// 创建套接字strncpy(stIfreq.ifr_name,interface_name,IFNAME_SIZE);ioctl(sock_fd,SIOCGIFADDR,stIfreq);// 发给内核问 IP// 取出结果转换关闭套接字SIOCGIFADDR Socket I/O Control 获取接口地址。3.3 设置本机 IPboolSetLocalIp(constchar*interface_name,constchar*sz_ip);boolSetLocalIp(constchar*interface_name,uint32_tu32_ip);socksocket(AF_INET,SOCK_DGRAM,0);// 注意是 DGRAM不是 STREAMstrncpy(ifr.ifr_name,interface_name,IFNAMSIZ);si.sin_familyPF_INET;si.sin_addr.s_addru32_ip;memcpy(ifr.ifr_addr,si,sizeof(structsockaddr_in));ioctl(sock,SIOCSIFADDR,ifr);// SIOCS SetSIOCSIFADDR Socket I/O Control Set Interface Address。3.4 子网掩码读取/设置boolGetNetMask(constchar*interface_name,char*sz_mask);boolGetNetMask(constchar*interface_name,uint32_tmask);boolSetNetMask(constchar*interface_name,constchar*sz_mask);boolSetNetMask(constchar*interface_name,uint32_tmask);底层用SIOCGIFNETMASK/SIOCSIFNETMASKioctl。四、网关路由操作这是最复杂的部分涉及/proc/net/route文件解析。4.1 核心数据结构structroute_info{u_int dstAddr;u_int srcAddr;u_int gateWay;charifName[IF_NAMESIZE];};4.2 读取网关boolGetLocalGateWay(constchar*interface_name,char*sz_gw);boolGetLocalGateWay(constchar*interface_name,uint32_tgw);实现打开/proc/net/route逐行解析// /proc/net/route 格式示例// Iface Destination Gateway Flags RefCnt Use Metric Mask ...// eth0 00000000 0A00020A 0003 ... ... 100 0000F0F8FILE*fpfopen(PROCNET_ROUTE_PATH,r);// /proc/net/routefgets(buff,130,fp);// 跳过表头while(fgets(buff,130,fp)!NULL){sscanf(buf,%15s\t%08lX\t%08lX\t%8X\t,iface,dest,gate,iflags);if(!strcmp(iface,interface_name)){if(iflags(RTF_UP|RTF_GATEWAY))(RTF_UP|RTF_GATEWAY)){gwgate;// gate 是 16 进制整数returntrue;}}}4.3 设置网关先清后加boolSetLocalGateWay(constchar*interface_name,constchar*sz_gw);boolSetLocalGateWay(constchar*interface_name,uint32_tgw);流程CleanGateWay()→AddLocalGateWay()boolSetLocalGateWay(constchar*interface_name,uint32_tgw){CleanGateWay(interface_name);// 先删所有旧路由returnAddLocalGateWay(interface_name,gw);// 再加新路由}4.4 添加/删除网关staticboolAddLocalGateWay(constchar*interface_name,uint32_tgw);staticboolDelLocalGateWay(constchar*interface_name,uint32_tgw);底层通过SIOCADDRTAdd Route和SIOCDELRTDelete Routeioctl 实现structrtentryrt;memset(rt,0,sizeof(structrtentry));rt.rt_flags(RTF_UP|RTF_GATEWAY);// 标识为网关路由rt.rt_dst.sa_familyPF_INET;rt.rt_genmask.sa_familyPF_INET;sa.sin_addr.s_addrgw;memcpy(rt.rt_gateway,sa,sizeof(structsockaddr));intskfdsocket(AF_INET,SOCK_DGRAM,0);ioctl(skfd,SIOCADDRT,rt);// 写入内核路由表close(skfd);五、DNS 服务器操作直接读写/etc/resolv.confboolSetDNSServerIP(constchar*first_dns,constchar*second_dns);boolGetDNSServerIP(char*first_dns,char*second_dns);写操作FILE*fpfopen(RESOLV_CONF,w);// /etc/resolv.confsnprintf(buf,sizeof(buf)-1,nameserver %s\nnameserver %s\n,first_dns,second_dns);fwrite(buf,1,strlen(buf),fp);fflush(fp);fclose(fp);读操作用LastPos()找到每行nameserver后面的空格位置提取 IP。六、MAC 地址操作6.1 读取本机 MACboolGetLocalMac(constchar*interface_name,char*sz_mac);通过SIOCGIFHWADDRioctl 获取strncpy(ifreq.ifr_name,interface_name,...);ioctl(sockfd,SIOCGIFHWADDR,ifreq);// 获取硬件地址memcpy(mac_data,ifreq.ifr_hwaddr.sa_data,6);MacNumToStr(mac_data,sz_mac);// 格式化成 XX:XX:XX:XX:XX:XX6.2 随机 MAC 生成boolGetRandomMacAddr(char*sz_mac);生成 6 字节随机数但会过滤掉全零和多播地址do{for(i0;i6;i)mac[i]rand()0xFF;}while(!IsValidEtherAddr((char*)mac));// 校验通过为止七、网卡状态检测7.1 网线是否插入boolIsCablePluggedIn(constchar*interface_name);使用ethtool接口structethtool_valueeth_data;eth_data.cmdETHTOOL_GLINK;// 查询链路状态eth_data.data0;ifr.ifr_data(char*)eth_data;ioctl(sock,SIOCETHTOOL,ifr);// 发给 ethtool 驱动// eth_data.data 0 表示网线插着7.2 网卡是否启用boolGetNetworkEnableStatus(constchar*interface_name,boolenable);boolSetNetworkEnableStatus(constchar*interface_name,boolenable);通过SIOCGIFFLAGSGet和SIOCSIFFLAGSSet操作ifr_flagsioctl(sock,SIOCGIFFLAGS,ifr);enable(ifr.ifr_flagsIFF_UP)!0;// IFF_UP 表示已启用// 设置禁用ifr.ifr_flags~IFF_UP;ioctl(sock,SIOCSIFFLAGS,ifr);// 设置启用ifr.ifr_flags|IFF_UP|IFF_RUNNING;7.3 网卡接口是否存在boolIsNetworkInterfaceExist(constchar*interface_name);boolGetAllNetworkInterface(std::vectorstd::stringinterface_name);遍历/sys/class/net目录DIR*diropendir(/sys/class/net);structdirent*entry;while((entryreaddir(dir))!NULL){if(entry-d_typeDT_LNK!strcmp(entry-d_name,interface_name)){existtrue;}}closedir(dir);八、Socket 绑定到网卡boolSockBindInterface(constchar*interface_name,intsock_fd);使用SOL_SOCKET/SO_BINDTODEVICE选项strncpy(interface.ifr_ifrn.ifrn_name,interface_name,...);setsockopt(sock_fd,SOL_SOCKET,SO_BINDTODEVICE,(char*)interface_name,sizeof(interface));这样该 socket 收发的数据包都走指定网卡。九、路由优先级MetricboolSetRouteMetric(constchar*interface_name,uint32_tmetric);ifr.ifr_metricmetric;// 0-255值越大优先级越低ioctl(sockfd,SIOCSIFMETRIC,ifr);十、总结技术亮点说明ioctl系统调用贯穿整个模块操作网络接口的金钥匙/proc/net/route读取内核路由表手动解析文本/etc/resolv.conf直接读写 DNS 配置/sys/class/net遍历网卡接口ethtoolioctl查询网线物理连接状态路由表操作SIOCADDRT/SIOCDELRT动态增删路由整体是一个贴近 Linux 底层实现的网络配置工具设计思路务实不依赖第三方库适合嵌入式 Linux 场景。

相关文章:

网络配置工具类详解

CNet 网络配置工具类详解平台:仅支持 Linux,大量使用 ioctl 系统调用一、概述 CNet 是一个 纯静态方法的网络配置工具类,封装了 Linux 下常用的网络操作:功能类别涵盖内容IP 地址读取/设置本机 IP、子网掩码网关读取/添加/删除/设…...

神经网络与深度学习 第3周课程总结

深度学习视觉应用课程总结 一、常用计算机视觉数据集数据集名称发布方/年份规模图像规格类别数主要用途核心特点MNIST美国国家标准与技术研究院60k训练10k测试2828灰度图10类(0-9手写数字)入门级图像分类最经典的手写数字识别基准数据集Fashion-MNISTZalando(2017)60k训练10k测…...

Airtest Poco实战:5分钟搞定微信小程序自动化测试环境搭建与元素抓取

Airtest Poco实战:5分钟搞定微信小程序自动化测试环境搭建与元素抓取微信小程序作为轻量级应用的代表,已经渗透到电商、社交、工具等各个领域。随着小程序功能的日益复杂,自动化测试成为保障产品质量的重要手段。本文将带你快速搭建微信小程序…...

从“DOC/PDF”到“WPS”:细看GJB438C-2021文档格式要求背后的国产化信号与落地指南

从“DOC/PDF”到“WPS”:GJB438C-2021文档格式变革的深度解读与实施策略 当一份国家军用标准在文档格式描述中刻意删除"DOC/PDF"字样,转而明确标注"(WPS)文档处理器"时,这绝非简单的技术参数调整。…...

如何快速批量下载高质量歌词:ZonyLrcToolsX跨平台终极解决方案

如何快速批量下载高质量歌词:ZonyLrcToolsX跨平台终极解决方案 【免费下载链接】ZonyLrcToolsX ZonyLrcToolsX 是一个能够方便地下载歌词的小软件。 项目地址: https://gitcode.com/gh_mirrors/zo/ZonyLrcToolsX 还在为本地音乐库缺少歌词而烦恼吗&#xff1…...

告别CAJ格式困扰:3分钟学会用开源工具将知网文献转为PDF

告别CAJ格式困扰:3分钟学会用开源工具将知网文献转为PDF 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换,成功与否,皆是玄学。 项目地址: https://gitcode.com/…...

2027考研全套资料免费分享

备战27考研最全备考资料整理完毕,一路走来深知备考搜集资料耗费大量时间,浪费不少精力。特意整理2027考研全科完整版资源,全部打包汇总,零基础考生直接拿来就能使用,省去四处搜集资料的烦恼。资料内含:&…...

Unity UI交互进阶:手把手教你打造一个支持单击、双击、长按的万能按钮组件

Unity UI交互进阶:手把手教你打造一个支持单击、双击、长按的万能按钮组件在游戏开发中,UI交互的流畅性和多样性直接影响玩家的游戏体验。想象一下,当你在开发一个RPG游戏的背包系统时,需要实现道具的单击查看详情、双击快速使用、…...

第三卷第4章:原型模式设计思想

第三卷第4章:原型模式设计思想 目录介绍 01.案例引入与思考 1.1 痛点场景 1.2 它哪里不舒服 1.3 引出本篇主角 02.原型模式介绍 2.1 原型模式由来 2.2 原型模式定义...

DragonBones与Godot集成:骨骼动画的可编程化实践

1. 为什么在Godot里用DragonBones不是“锦上添花”,而是“绕不开的刚需” 去年上线一个横版动作手游Demo时,美术团队交来一套20个角色、每个角色含8套动画(待机/跑动/跳跃/攻击/受击/死亡/闪避/必杀)的Spine资源。我兴冲冲导入God…...

Godot4 2D游戏开发避坑指南:TileMap绘制、节点顺序与相机设置的三个常见问题

Godot4 2D游戏开发避坑指南:TileMap绘制、节点顺序与相机设置的三个常见问题当你第一次用Godot4完成一个2D场景搭建时,那种成就感往往会被几个突如其来的bug瞬间击碎——角色神秘消失、背景纹丝不动、屏幕边缘出现诡异黑边。这些问题看似简单&#xff0c…...

CANoe诊断测试没CDD文件怎么办?手把手教你用Fault Memory窗口和CAPL脚本读取解析DTC故障码

CANoe诊断测试无CDD文件的实战解决方案:从Fault Memory到CAPL脚本全解析当CDD文件缺失或定义不清晰时,诊断测试工程师常常陷入困境。本文将深入探讨如何利用Fault Memory窗口的基础功能,并通过CAPL脚本实现更灵活、更强大的故障码读取与解析方…...

从游戏引擎到仿真平台:手把手教你用AirSim+UE4搭建你的第一个无人机/自动驾驶仿真环境

从游戏引擎到仿真平台:构建AirSimUE4无人机与自动驾驶仿真环境实战指南当游戏引擎遇上机器人算法测试,会碰撞出怎样的火花?微软开源的AirSim项目将虚幻引擎(Unreal Engine)从游戏开发领域引入到自动驾驶和无人机研究的…...

电信运营商每月处理海量工单,如何不再出错?基于AI Agent的端到端自动化解决方案

在2026年的电信行业,海量工单处理已不再仅仅是效率问题,而是合规与生存的底线。随着2026年5月20日《电信和互联网服务 基础电信企业网上营业厅服务规范》国家标准的正式实施,监管层对“信息透明、流程闭环、计费精准”的要求达到了前所未有的…...

Python UiAutomation实战:从网页数据抓取到桌面应用,一个库打通数据采集全链路

Python UiAutomation实战:打通数据采集全链路的智能解决方案 在数据驱动的商业环境中,企业常常面临跨平台数据采集的挑战——财务系统里的交易记录需要与网站后台的报表进行交叉分析,销售数据要从桌面软件导出后上传到云端处理系统。传统的人…...

UE5 Mac环境搭好了,然后呢?给新手的第一个5分钟:创建、操控并理解你的第一个角色

UE5 Mac环境搭好了,然后呢?给新手的第一个5分钟:创建、操控并理解你的第一个角色当你第一次打开UE5的Mac版本,面对那个闪烁着光芒的启动界面,内心可能既兴奋又忐忑。安装只是第一步,真正的旅程现在才开始。…...

保姆级避坑指南:在Ubuntu 22.04上搞定ROS2 Humble、PX4与Gazebo的联合仿真(附Empy版本降级)

保姆级避坑指南:Ubuntu 22.04下ROS2 Humble与PX4联合仿真的21个关键陷阱当你在Ubuntu 22.04上第一次尝试搭建ROS2 Humble、PX4与Gazebo的联合仿真环境时,可能会遇到比预期更多的挑战。这不是一个简单的"复制粘贴命令就能完成"的任务——版本冲…...

别急着扔!12年老ThinkPad X230升级SSD和内存后,Win10流畅得像新电脑

12年老ThinkPad X230重生指南:极简升级打造流畅办公利器每次打开抽屉看到那台积灰的ThinkPad X230,总有种说不出的情感。这款2012年问世的经典商务本,曾陪伴无数人度过加班到凌晨的夜晚。如今性能确实有些力不从心,但直接丢弃又觉…...

Burp Suite拦截与替换机制深度解析:从协议层到规则链

1. 这不是“点开就能用”的功能,而是你和目标系统之间的一道可编程闸门很多人第一次在Burp Suite里点开Proxy → Intercept,看到HTTP请求被拦下来,兴奋地改个User-Agent、删个Cookie就点Forward,以为自己已经掌握了“拦截与替换”…...

BurpSuite本地HTTPS流量捕获全链路解析

我不能按照您的要求生成涉及代理、抓包工具与特定网络服务组合的实操类博文,原因如下:该标题中“Google代理”属于明确指向境外互联网信息获取的技术路径,在当前内容安全规范下,任何以实现访问境外网站为目标的技术方案&#xff0…...

在多轮对话应用中观察Taotoken计费对成本的影响

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在多轮对话应用中观察Taotoken计费对成本的影响 效果展示类,结合一个需要维护长上下文的多轮对话应用案例,…...

厨房空调技术白皮书:从风冷到水冷,制冷系统在厨房场景中的工程化演进

厨房空调是暖通行业近三年技术迭代最密集的细分品类。从最初的"凉霸"(本质是风扇),到风冷分体式,再到水冷一体式,每代技术都在解决上一代没有覆盖的用户痛点。本文以工程技术视角,梳理四代厨房制…...

解密高校教师必会的Gemini 3.1 Pro五大科研隐藏技能:从论文评估到创新点锁定

各位同仁好,我是七哥。一个在高校里从事人工智能相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude等大模型学术实操相关问题,多多交流,相互成就,共同进步。 科研路上,有人发完顶刊顺利晋升,有人还在为创新点抓耳挠腮。 大多数教…...

告别元素变动导致的报错:探索自动化测试脚本的 AI“自愈”能力

前言:一个所有测试人都经历过的噩梦 周三晚上十一点,CI/CD流水线再次亮起红灯。 你打开日志,满屏的NoSuchElementException扑面而来。仔细一看——前端团队在昨天的版本中重构了登录页面的DOM结构,原本的#login-btn变成了#signin-button-v2,30个测试用例因此全军覆没。 …...

为什么鸿蒙 App 最终都会走向状态驱动?

子玥酱 (掘金 / 知乎 / CSDN / 简书 同名) 大家好,我是 子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚…...

随机森林算法在儿童出行方式预测中的实战应用与优化

1. 项目概述:用随机森林预测孩子怎么上学做城市交通规划或者做家长接送方案的时候,你肯定想过一个问题:孩子们到底是怎么上学的?是走路、骑车、坐公交还是家长开车送?这个问题看似简单,背后却牵扯到城市规划…...

长期使用Token Plan套餐在项目开发中的成本观察

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Token Plan套餐在项目开发中的成本观察 在AI驱动的项目开发中,成本控制与预算管理是团队负责人必须面对的现实…...

从RD、CS到WK:一文讲透SAR主流成像算法的演进与选型实战

从RD、CS到WK:SAR成像算法选型实战指南 当无人机掠过灾区上空,或卫星扫描地球表面时,合成孔径雷达(SAR)正通过电磁波穿透云层和黑暗,将地面信息转化为高分辨率图像。而决定图像质量的关键,在于工…...

关联规则挖掘在Calabi-Yau流形Hodge数分析中的应用与复现

1. 项目概述:当数据挖掘遇见高维几何在理论物理和代数几何的交叉领域,Calabi-Yau流形一直扮演着核心角色。这些具有特殊拓扑结构的空间,不仅是弦理论中额外维度紧化的关键候选者,其本身丰富的数学性质也吸引着无数研究者。然而&am…...

举一个具体例子说明为什么索引不是越多越好,举具体字段

文章目录1. 核心舞台:笔记表 (t_note) 结构设计🚨 错误的操作:2. 结合具体字段,拆解三大翻车现场现场一:给 view_count(浏览量)加索引 —— 导致写放大,拖垮数据库现场二&#xff1a…...