基于STM32H750XBH6开发板的LwIP socket编程初探
这里写目录标题1、RAW、NETCONN和socket编程特点2、基于socket的UDP编程3、基于socket的TCP编程3.1、TCP客户端编程3.2、TCP客户端编程4、问题记录1、RAW、NETCONN和socket编程特点LwIP下三种编程方式分别是RAW API、NETCONN API和Socket API,这三种方式均可以实现常用TCP和UDP通信功能,区别在于开发难度、运行机制和应用场景不同。RAW API是LwIP的原生接口,适用于无操作系统编程场景,这种编程模式占用资源最少、性能最高,但是开发难度最大,适用于追求极致性能的裸机场景。NETCONN API编程必须在RTOS线程里适用,适用于阻塞/非阻塞模型,开发起来比RAW简单多了,是一般ESP32 IDF底层常用方式,但是不能跨平台。Socket API的底层就是封装了NETCONN API,和linux系统下网络编程一样是POSIX标准socket,适用于绝大部分应用层项目。三者之间特点总结如下表:维度RAWNETCONNsocket编程模式事件驱动+回调函数顺序执行+半阻塞标准阻塞式操作系统裸机/RTOSRTOSRTOS资源占用率低中高性能极高高一般编程难度最高适中简单本章在上一章节基于STM32H750XBH6开发板调试FreeRTOS+LwIP程序的基础上实现UDP和TCP通信功能。首先在LWIP → Key Options → LWIP_SOCKET配置中要打开socket,然后注意socket任务的栈空间大小不能太小。为了调试方便,初始化的时候在start任务MX_LWIP_Init();之后创建一个lwip_demo_task,在这个任务中分别调用UDP、TCP client以及TCP server函数与上位机实现通信,后面所列内容都只粘贴主要部分代码,调试时自行修改即可。2、基于socket的UDP编程标准的UDP Socket通信功能实现主要有以下四个步骤:1)创建Socket:使用socket(AF_INET, SOCK_DGRAM, 0) 创建一个数据报类型的套接字。2)绑定本地地址 (Bind):如果需要固定端口接收数据(作为服务器或监听端),需要使用 bind()将Socket绑定到本机的特定端口上。通常会将IP设置为INADDR_ANY,表示监听本机所有网络接口。3)发送数据 (Sendto):使用sendto() 函数,指定目标IP和端口进行数据发送。4)接收数据 (Recvfrom):使用recvfrom() 函数阻塞或非阻塞地等待并接收来自任意客户端的数据。核心代码如下:#include"lwip/sockets.h"// LwIP 的 Socket API 头文件// 1. 创建 UDP Socketintsock_fd=socket(AF_INET,SOCK_DGRAM,0);if(sock_fd0){/* 处理创建失败 */}// 2. 绑定本地端口(以8080为例)structsockaddr_inlocal_addr;memset(local_addr,0,sizeof(local_addr));local_addr.sin_family=AF_INET;local_addr.sin_port=htons(8080);// 设置本地监听端口local_addr.sin_addr.s_addr=INADDR_ANY;// 绑定本机所有IPif(bind
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2628730.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!