Lwip之TCP服务端示例记录(1对多)

前言

  1. 实现多个客户端同时连接
  2. 初步代码结构已经实现完成(通过轮训的方式)
//
// Created by shchl on 2024/3/8.
//
#if  1#include <string.h>
#include "lwip/api.h"
#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "lwip_comm.h"#define CLIENT_LIST_SIZE 3
typedef struct {u8_t stat;/*0表示未连接,1表示已建立连接*/struct netconn *conn;struct netbuf *net_buf;ip_addr_t ip; /*地址*/u16_t port;/*端口*/
#define BUF_SIZE 1024u8_t buf[BUF_SIZE];/*存放数据*/} client_pcb;/*客户端控制块*/
static TaskHandle_t tcp_server; /*任务句柄*/
static TaskHandle_t tcp_client; /*任务句柄*/
static void tcp_server_entity(void *args);client_pcb client_list[CLIENT_LIST_SIZE]; /*客户端列表*/static void tcp_client_request_entity(void *args);void netconn_tcp_server_create_thread() {/*初始化*/memset(client_list, 0, sizeof(client_list));xTaskCreate((TaskFunction_t) tcp_server_entity,"tcp_server",256,NULL,10,&tcp_server);xTaskCreate((TaskFunction_t) tcp_client_request_entity,"tcp_client",256,NULL,9,&tcp_client);}#define TCP_SERVER_RX_BUFSIZE 1500
static struct netconn *conn;
static struct netconn *client_conn;/*客户端连接*/
static uint8_t remot_addr[4] = {0}; /*远端ip数组*/
static u16_t port;/*远端端口*/
static ip_addr_t ipaddr;/*远端ip*/
static u8_t tcp_server_recvbuf[TCP_SERVER_RX_BUFSIZE] = {0};static void tcp_server_entity(void *args) {err_t err;conn = netconn_new(NETCONN_TCP);  //创建一个TCP链接netconn_bind(conn, IP_ADDR_ANY, 8080);  //绑定端口 8号端口netconn_listen(conn);        //进入监听模式conn->recv_timeout = 10;    //禁止阻塞线程 等待10msstruct netconn *cli_con;while (1) {begin_listen:err = netconn_accept(conn, &cli_con);  //接收连接请求if (err == ERR_OK) {cli_con->recv_timeout = 10;for (int i = 0; i < CLIENT_LIST_SIZE; ++i) {if (client_list[i].stat == 0) {netconn_getaddr(cli_con, &client_list[i].ip, &client_list[i].port, 0); //获取远端IP地址和端口号remot_addr[3] = (uint8_t) (client_list[i].ip.addr >> 24);remot_addr[2] = (uint8_t) (client_list[i].ip.addr >> 16);remot_addr[1] = (uint8_t) (client_list[i].ip.addr >> 8);remot_addr[0] = (uint8_t) (client_list[i].ip.addr);printf("主机%d.%d.%d.%d连接上服务器,主机端口号为:%d\r\n",remot_addr[0], remot_addr[1], remot_addr[2], remot_addr[3], client_list[i].port);client_list[i].stat = 1;client_list[i].conn = cli_con;goto begin_listen;}}/*释放链接*/netconn_close(cli_con);netconn_delete(cli_con);}vTaskDelay(10);}
}static void tcp_client_request_entity(void *args) {client_pcb *p_client;err_t err;u32_t data_len;while (1) {for (int i = 0; i < CLIENT_LIST_SIZE; ++i) {p_client = &client_list[i];if (p_client->stat == 1) {err = netconn_recv(p_client->conn, &p_client->net_buf);switch (err) {case ERR_OK: {portDISABLE_INTERRUPTS();memset(p_client->buf, 0, BUF_SIZE);  //数据接收缓冲区清零for (struct pbuf *q = p_client->net_buf->p; q != NULL; q = q->next)  //遍历完整个pbuf链表{if (q->len > (BUF_SIZE - data_len)) {/*数据超出缓冲区大小*/memcpy(p_client->buf + data_len, q->payload, BUF_SIZE - data_len);break;} else {memcpy(p_client->buf + data_len, q->payload, q->len);}data_len += q->len;if (data_len > BUF_SIZE) break;}portENABLE_INTERRUPTS();// todo 应用逻辑处理netconn_write(p_client->conn, p_client->buf, data_len, NETCONN_COPY);data_len = 0;  //复制完成后data_len要清零。netbuf_delete(p_client->net_buf);break;}case ERR_CLSD:case ERR_RST: {goto release_conn_tag;}default:if (g_lwipdev.link_status == LWIP_LINK_OFF) { /*判断网线是否连接正常*/printf("物理连线出现问题\r\n");goto release_conn_tag;}}continue;release_conn_tag: /*释放链接*/{netconn_close(p_client->conn);netconn_delete(p_client->conn);p_client->stat = 0;}}vTaskDelay(10);}}}#endif

测试结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/731770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

群辉docker安装sql server

安装步骤 开启群辉 SSH&#xff0c;通过 SSH 工具连接到群辉&#xff0c;运行下面的命令拉取mssql 2019 镜像 sudo docker pull mcr.microsoft.com/mssql/server:2019-latest然后在 docker 中就可以看到该镜像&#xff1a; 在群晖 docker 共享文件夹中创建 mssql2009 文件夹 …

Qt插件之输入法插件的构建和使用(二)

文章目录 主键盘搭建Google开源引擎音节分割工具类参考项目下载搭建好各个基础控件之后,就可以开发输入法的主界面和引擎了,这也是输入法的核心。 主键盘搭建 输入法的主界面本质上是一个QStackedWidget容器,将各个类型的输入键盘插入到容器中,然后根据业务需要切换不同的…

金现代产品方案部部长王宁,将出席“ISIG-低代码/零代码技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;LowCode低码时代、RPA中国、AIGC开放社区&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索低…

生产管理MES系统在卫浴企业中的应用

在卫浴企业的制造过程中&#xff0c;实现透明车间管理是一个旨在提升效率、质量和可视性的重要目标。MES系统可以在卫浴企业中帮助打造透明车间&#xff0c;提升生产管理的效率和可视性。具体能实现哪些管理呢&#xff1f; 实时监控生产状态&#xff1a; MES系统可以实时监控车…

【C#杂谈】在 .NET Framework 中使用新的C#语言特性

前排提示&#xff1a;提出一个可以让 [^1] 这中语法可以在.NET Framework运行时中使用的方法 众所都周知&#xff0c;.NET Framework&#xff08;以下简称 .NF&#xff09;作为一个被微软官方确认不在继续发布新特性的运行时&#xff0c;它所对应的C#语言版本被&#xff08;官方…

RabbitMQ架构详解

文章目录 概述架构详解核心组件虚拟主机&#xff08;Virtual Host&#xff09;RabbitMQ 有几种广播类型 概述 RabbitMQ是⼀个高可用的消息中间件&#xff0c;支持多种协议和集群扩展。并且支持消息持久化和镜像队列&#xff0c;适用于对消息可靠性较高的场合 官网https://www.…

uniapp富文本编辑-editor-vue2-vue3-wangeditor

前言 除了“微信小程序”&#xff0c;其他小程序想要使用editor组件实现富文本编辑&#xff0c;很难vue3项目 官方组件editor&#xff0c;在初始化时有点麻烦&#xff0c;建议搭配第三方组件wangeditor 写在前面 - editor组件缺少editor-icon.css 内容另存为editor-icon.css…

服务器租用和托管的区别

目前对于服务器要求相对高的企业会希望使用独立服务器来运行自己的网站&#xff0c;而在选择独立服务器业务事&#xff0c;是使用服务器托管还是服务器租用这两种方法时&#xff0c;许多刚进入网络或者传统行业的从业者&#xff0c;都不太了解什么是服务器&#xff0c;现在我来…

系统安全保证措施-word

【系统安全保证措施-各支撑材料直接套用】 一、 身份鉴别 二、 访问控制 三、 通信完整性、保密性 四、 抗抵赖 五、 数据完整性 六、 数据保密性 七、 应用安全支撑系统设计 软件全套资料下载进主页。

JProfiler详解 JVM性能监测内存泄露分析工具

JProfiler详解 JProfiler简介主要功能特点使用场景注意事项使用案例使用步骤Could not verify ssh-ed25519 host key with fingerprint 问题解决内存泄露分析 JProfiler简介 JProfiler是一款业界领先的Java性能分析工具&#xff0c;由ej-technologies公司开发&#xff0c;专门…

STM32自学☞WDG(看门狗)及其案例

一、WDG简介 由于看门狗的代码很少所以就直接在main主函数中写了&#xff0c;没单独建文件 二、独立看门狗 涉及的按键可参考之前的key.c和key.h文件 独立看门狗配置流程&#xff1a; 1.开启时钟&#xff08;LSI&#xff09; 2.解除IWDG_PR和IWDG_RLR的写保护 3.写入预分频和重…

【C++】什么是类与对象?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 面向对象概述 封装 继承 多态 类 类是什么? C中类的引入 C中类的定义 类的两种定义方式: 1.声明和定义全部放在类体中 2.类声明与成员函数定义分别放在不同的工程文件中…

Qt开发QHostInfo主机地址查询组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QHostInfo组件实现对主机地址查询功能…

三井住友保险中国区信息技术部负责人陈婧,将出席“ISIG-RPA超级自动化产业发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;RPA中国、AIGC开放社区、LowCode低码时代&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索R…

用一个 Python 脚本实现依次运行其他多个带 argparse 命令行参数的 .py 文件

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 问题描述&#xff1a;在 Windows 环境中&#xff0c;您希望通过一个 Python 脚本来实现特定的自动化任务&#xff0c;该任务需要依次运行其他多个带 argparse 命令行参数的 .py 文件。您希望找到一种简…

手写分布式配置中心(六)整合springboot(自动刷新)

对于springboot配置自动刷新&#xff0c;原理也很简单&#xff0c;就是在启动过程中用一个BeanPostProcessor去收集需要自动刷新的字段&#xff0c;然后在springboot启动后开启轮询任务即可。 不过需要对之前的代码再次做修改&#xff0c;因为springboot的配置注入value("…

C++命名空间详解

目录 C的由来&#xff1a; C语言的命名缺陷&#xff1a; 什么是命名空间&#xff1f; 命名空间的访问方式&#xff1a; 1、指定访问 2、展开命名空间&#xff08;慎用&#xff09; 相关知识&#xff1a; C的由来&#xff1a; C原来本质上是在C的基础上补充的语法&#x…

ARM单片机中程序在ROM空间和RAM空间的分布(分散加载文件,Scatter-Loading Description File)

对于 K e i l u V i s i o n I D E Keil\quad uVision\quad IDE KeiluVisionIDE&#xff0c;程序编译好之后&#xff0c;代码的下载位置&#xff08; R O M ROM ROM空间&#xff09;以及代码运行的时候使用的 R A M RAM RAM空间&#xff08; R A M RAM RAM空间&#xff09;默认…

下载一些ROS的包的方式

ROS Index 我们可以去ROS Index网站下载一些我们需要的包。打开浏览器在网址框输入index.ros.org。或者点击此处链接ROS Index 在这个网站中我们可以浏览并找到我们需要的包&#xff0c;也可以下载它的源代码或者仅安装到我们的系统中来使用。&#xff08;安装过程在终端中进行…

植物病虫害:YOLO水稻虫害识别数据集(6类,五千余张图像,标注完整)

YOLO水稻虫害识别数据集&#xff0c;包含褐飞虱&#xff0c;绿叶蝉&#xff0c;正常叶片&#xff0c;稻虫&#xff0c;二化螟&#xff0c;蝇蛆6个类别&#xff0c;共五千余张图像&#xff0c;yolo标注完整。 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c;实验等 …