当前位置:网站首页>嵌入式开发小记,实用小知识分享
嵌入式开发小记,实用小知识分享
2022-07-26 05:07:00 【an520_】
之前为了方便测试部门保存一些测试数据,需要临时开发一个简单的nanomsg server,与板子端的client在局域网内进行通信,接收client数据并保存。
作为server端,需要绑定电脑的IP,不同的电脑IP是不一样的,所以使用不同的电脑时需要修改IP才能正常使用这个server程序。
在不需要重新编译程序的情况下,有如下两种方法可以满足这个需求:
把IP写在配置文件里,比如ini格式的配置文件里,然后server程序读取配置文件里的IP,再进行绑定。
server程序自动获取IP地址并绑定。
下面分别使用这两种方法:
从配置文件中读取IP地址
配置文件的格式有很多,如JSON、INI等。这里我选用的是INI格式的配置文件,.ini 文件是 Initialization File 的缩写,即初始化文件。INI文件由节、键、值组成,注解使用分号表示(;)。例如:

这里我们使用inih解析器来对INI文件进行解析。
inih:一个C 语言编写的 INI 文件解析器。
inih解析器的地址:
GitHub - benhoyt/inih: Simple .INI file parser in C, good for embedded systems

同时,inih解析器也已经被收录于大杂烩资源汇总贴中:
inih的使用很简单,下面一起来看一下。
下载得到的inih内容如图所示:

把 ini.c 与 ini.h 放到我们的工程下即可。这里我们使用一个测试工程:

同时,新建一个 ip.ini 文件存放于工程目录下。ip.ini 文件的内容如:

下面我们编写代码test.c来解析这个文件:

解析方法很简单(可参考 inih/examples 下的demo,我们这里也是模仿这个demo来做解析的):
构造一个配置结构体
configuration,定义一个configuration结构体用于保存我们解析的数据,结构体里面的成员就是我们需要解析的INI文件里的各个键。例如,我们的ip.ini文件里有ip_addr、name、num这三个键,结构体里的成员表示的就是这三个键。定义一个handler回调函数,用于处理解析过程。解析过程也很简单,匹配Section Name及Key Name,然后取出值即可。
调用
ini_parse函数对INI文件进行解析。
其中,handler函数里调用了一个 strdup() 函数及 atoi() 函数。
strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和free()函数成对出现,,因为strdup()在内部调用了malloc()函数为变量分配内存。
atoi()函数(ascii to integer)是把字符串转换成整型数的一个函数。
编译、运行:

自动获取IP地址
我们可以使用 getifaddrs() 函数来获取。getifaddrs()函数用于获取网卡信息,包括IP、掩码、广播地址等信息。
getifaddrs()函数原型:

__ifap为获取得到的网卡信息。
用getifaddrs()函数获取得到的IP格式为 数值格式(numeric),需要转成 表达格式(presentation)。inet_ntop() 函数可以满足这个需求。
inet_ntop()函数是随IPv6出现的函数,对于IPv4地址和IPv6地址都适用,函数中p和n分别代表 表达格式(presentation) 和 数值格式(numeric) 。IP地址的表达格式是ASCII字符串,数值格式则是存放到套接字地址结构的二进制值。我们这里需要的就是ASCII字符串形式的IP地址。
inet_ntop()函数原型:

family参数:既可以是AF_INET(ipv4)也可以是AF_INET6(ipv6)。
addrptr参数:addrptr指针指向数值格式的IP。
strptr参数:strptr指向表达格式的IP,调用者必须为目标存储单元分配内存并指定其大小。
len参数:容纳表达格式的长度。
返回值:若成功则为指向表达格式的指针,若出错则为NULL。
下面看看实例代码:
编译、运行:


以上就是本次的分享~
【学习交流群769843038】
【下方分享一些学习教程】:
【网盘免费资料包,需要的自行领取】:
嵌入式物联网 22个STM32项目、大赛作品,【华清远见发放资料包】
http://makerschool.mikecrm.com/f4wjYBB

边栏推荐
- 分布式ID的常用解决方案-一把拿下
- The landing of tdengine in the GPS and AIS scheduling of Zhongtian steel
- Yolov5 implementation process - Directory
- Computable general equilibrium (CGE) model practice technology in resource environment under the goal of "double carbon"
- Molecular skeleton transition tool -delinker introduction
- AXI协议(4):AXI通道上的信号
- security权限管理详解
- Why is the value represented by a negative number greater than an integer by 1?
- Several maturity levels of using MES management system
- [Luogu] p1383 advanced typewriter
猜你喜欢

Axi protocol (5): burst mechanism of Axi protocol

遥感、GIS和GPS技术在水文、气象、灾害、生态、环境及卫生等领域中的应用

手把手教你用代码实现SSO单点登录

Shell的read 读取控制台输入、read的使用

Earth system model (cesm) practical technology

Mysql主从同步及主从同步延迟解决方案

LeetCode链表问题——206.反转链表(一题一文学会链表)

开发转测试:从零开始的6年自动化之路
![[pytorch] install torch 1.8.1 and check whether torch version and GPU are available](/img/97/078c72729a29675939a84895b5ab86.png)
[pytorch] install torch 1.8.1 and check whether torch version and GPU are available

Redis solves the problem of oversold inventory
随机推荐
Unnamed Article 33
A material of machine learning
Embedded sharing collection 20
基于遥感解译与GIS技术环境影响评价图件制作
测试用例评审如何开展
Shell流程控制(重点)、if 判断、case 语句、let用法、for 循环中有for (( 初始值;循环控制条件;变量变化 ))和for 变量 in 值 1 值 2 值 3… 、while 循环
安装NCCL\mpirun\horovod\nvidia-tensorflow(3090Ti)
Ansible tutorial
Week 6 Learning Representation: Word Embedding (symbolic →numeric)
JVM第六讲:线上环境 FGC 频繁,如何解决?
域名解析过程全分析,就着文字理解更佳
C语言力扣第41题之缺失的第一个正数。两种方法,预处理快排与原地哈希
CMD operation command
How to reproduce the official course of yolov5 gracefully (II) -- Mark and train your own data set
没背景、没学历?专科测试员进入互联网大厂是不是真的没希望?
Redis解决库存超卖问题
公交站间的距离 : 简单模拟题
如何优雅的复现YOLOv5官方历程(二)——标注并训练自己的数据集
嵌入式分享合集21
[pytorch] install torch 1.8.1 and check whether torch version and GPU are available