Lwip之TCP服务端示例记录(1对多)
前言
- 实现多个客户端同时连接
- 初步代码结构已经实现完成(通过轮训的方式)
//
// 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
测试结果

相关文章:
Lwip之TCP服务端示例记录(1对多)
前言 实现多个客户端同时连接初步代码结构已经实现完成(通过轮训的方式) // // 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&…...
哲理:为什么你要学习编程这项技能
有一家饭店的大厨,烧得一手好菜,经过口碑相传,客人从五湖四海闻名而来。然而这对饭店的老板来说,并不单纯是一个好消息。因为客人不是奔着饭店,而是奔着大厨的手艺来的。老板必须想办法留住这位大厨,否则他…...
【机器学习300问】30、准确率的局限性在哪里?
一、什么是准确率? 在解答这个问题之前,我们首先得先回顾一下准确率的定义,准确率是机器学习分类问题中一个很直观的指标,它告诉我们模型正确预测的比例,即 还是用我最喜欢的方式,举例子来解释一下…...
融资项目——网关微服务
1. 网关的路由转发功能 在前后端分离的项目中,网关服务可以将前端的相关请求转发到相应的后端微服务中。 2. 网关微服务的配置 首先需要创建一个网关微服务,并添加依赖。 <!-- 网关 --><dependency><groupId>org.springframework.cl…...
飞驰云联CEO朱旭光荣获“科技领军人才”称号
2024年2月29日,苏州工业园区“优化营商环境暨作风效能建设大会”成功举办,会上公布了2023年度苏州工业园区第十七届第一批金鸡湖科技领军人才名单,Ftrans飞驰云联创始人兼CEO朱旭光先生凭借在数据安全以及文件交换领域取得的突出成果…...
Dockerfile的使用,怎样制作镜像
Docker 提供了一种更便捷的方式,叫作 Dockerfile docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build命令参数: --build-arg,设置构建时的变量 --no-cache,默认false。设置该选项,将不使用Build …...
外包干了5天,技术退步明显。。。。。
在湖南的一个安静角落,我,一个普通的大专生,开始了我的软件测试之旅。四年的外包生涯,让我在舒适区里逐渐失去了锐气,技术停滞不前,仿佛被时间遗忘。然而,生活的转机总是在不经意间降临。 与女…...
leetcode2834--找出美丽数组的最小和
1. 题意 求一个序列和。序列 a a a满足: 大小为 n n n ∀ 0 ≤ i , j < n , i ≠ j , a i a j ≠ t a r g e t \forall 0\le i,j \lt n,i \ne j,a_ia_j \ne target ∀0≤i,j<n,ij,aiajtarget 找出美丽数组的最小和 2. 题解 贪心的构造这个序列。…...
【NR 定位】3GPP NR Positioning 5G定位标准解读(七)- GNSS定位方法
前言 3GPP NR Positioning 5G定位标准:3GPP TS 38.305 V18 3GPP 标准网址:Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读(一)-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读(…...
结构体和malloc学习笔记
结构体学习: 为什么会出现结构体: 为了表示一些复杂的数据,而普通的基本类型变量无法满足要求; 定义: 结构体是用户根据实际需要自己定义的符合数类型; 如何使用结构体: //定义结构体 struc…...
Nginx常用命令总结及常见问题排查
连续更新挑战第4天… 目录 常用启停命令Nginx 常见问题Nginx 如何忽略非标准http头检测?Nginx websocket代理Nginx 临时缓存不够导致下载文件失败Nginx 没有临时缓存目录权限导致下载文件失败Nginx非root用户启动无法使用80端口或者报无权限异常路由重写怎么配置?nginx 根据…...
微服务超大Excel文件导出方案优化
1、在导出Excel时经常会碰到文件过大,导出特别慢 2、微服务限制了请求超时时间,文件过大情况必然超时 优化思路: 1、文件过大时通过文件拆分、打包压缩zip,然后上传到oss,并设置有效期(30天过期) 2、把…...
论文阅读之Multimodal Chain-of-Thought Reasoning in Language Models
文章目录 简介摘要引言多模态思维链推理的挑战多模态CoT框架多模态CoT模型架构细节编码模块融合模块解码模块 实验结果总结 简介 本文主要对2023一篇论文《Multimodal Chain-of-Thought Reasoning in Language Models》主要内容进行介绍。 摘要 大型语言模型(LLM…...
灯塔:CSS笔记(2)
一 选择器进阶 后代选择器:空格 作用:根据HTML标签的嵌套关系,,选择父元素 后代中满足条件的元素 选择器语法:选择器1 选择器2{ css } 结果: *在选择器1所找到标签的后代(儿子 孙子 重孙子…...
基于Springboot的志愿服务管理系统(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的志愿服务管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…...
保姆级讲解 Stable Diffusion
目录 本文讲解思路介绍 一、引入 二、Diffusion Model 三、原文的摘要和简介 四、Stable Diffusion 4.1、组成模块 4.2、感知压缩 4.3、条件控制 五、图解 Stable Diffusion 5.1、潜在空间的扩散 5.2、条件控制 5.3、采样 5.4、Diffusion Model 与 Stable Diffusion …...
HTML二识
图片,音频,视频标签 标签描述<img>定义图片<audio>定义音频<video>定义视频 定义图片: src:规定显示图片的URL(统一资源定位符)height:定义图像的高度 单位:px…...
[BUUCTF]-PWN:starctf_2019_babyshell解析(汇编\x00开头绕过+shellcode)
查看保护 查看ida 这里就是要输入shellcode,但是函数会有检测。 在shellcode前面构造一个以\x00机器码开头的汇编指令,这样就可以绕过函数检查了。 完整exp: from pwn import* context(log_leveldebug,archamd64) pprocess(./babyshell)she…...
uniapp 手写 简易 时间轴 组件
一、案例如图 该案例设计条件: 左侧时间 和竖线、点、内容都是居中对其的,上下时间点中间要有一段距离 二、编写逻辑 1. 布局结构:一共三个元素,左侧是时间和黑点,中间是线条,右侧是内容 2. 样式难点&#…...
实现HttpServletRequest下多次获取流数据
HttpServletRequest下多次获取流数据 背景示例错误的尝试全局替换执行顺序 背景 众所周知request的输入流只能读取一次,不能重复读取。而在HttpServletRequest中,获取请求体数据的流(通过getInputStream()方法)默认只能被读取一…...
基于蓄电池进行调峰和频率调节研究【超线性增益的联合优化】附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...
DeepSeek-R1-Distill-Qwen-1.5B量化方案对比:Q4_K_M vs Q3_K_S哪个更适合你?
DeepSeek-R1-Distill-Qwen-1.5B量化方案对比:Q4_K_M vs Q3_K_S哪个更适合你? 1. 量化方案选择的重要性 在资源受限的环境中部署AI模型时,量化技术成为平衡性能与效率的关键手段。DeepSeek-R1-Distill-Qwen-1.5B作为一款1.5B参数的"小钢…...
从零到壹嵌入式Linux编程实战教程课:第6课 嵌入式C语言进阶(适配实战)模块一:基础入门
文章目录一、课程目标二、嵌入式C语言基础回顾与实战适配1. C语言与嵌入式开发的关联2. 基本程序结构三、核心基础:数据类型与变量1. 嵌入式常用数据类型2. 变量定义与初始化四、运算符与表达式1. 常用运算符(实战高频)2. 表达式优先级五、分…...
Shopee API逆向分析:如何用Java安全地获取商品分类与列表数据(附完整代码)
Java实战:电商平台商品数据采集与分析技术解析 在当今数据驱动的商业环境中,理解电商平台的商品数据结构对于市场研究、竞品分析和商业决策具有重要意义。本文将深入探讨如何通过技术手段获取和分析电商平台的商品分类与列表数据,同时强调技术…...
3dsconv:3DS游戏文件转换的终极解决方案,快速将.3ds转为CIA格式
3dsconv:3DS游戏文件转换的终极解决方案,快速将.3ds转为CIA格式 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3…...
Linux基础命令(系统信息类)
今天给大家展示一下多用于查看系统状态信息的命令,分别是lscpu,free,df,uptime,uname以及wlscpu #查看cpu信息Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s…...
别再为Multisim 14.3汉化头疼了!保姆级图文教程,从激活到界面中文化一步到位
Multisim 14.3汉化与激活全流程实战指南 电子工程师和学生们在初次接触Multisim 14.3时,往往会遇到两个关键障碍:软件激活和界面汉化。这两个看似简单的步骤,却可能因为细节处理不当而导致整个安装过程功亏一篑。本文将深入解析激活与汉化的每…...
手把手教你搞定OpenStack Train版离线部署:从零搭建私有云(附完整yum源制作)
企业级OpenStack Train离线部署实战:从yum源构建到私有云落地 在数字化转型浪潮中,企业对于私有云的需求日益增长。OpenStack作为开源云计算平台的标杆,其灵活性和可扩展性备受青睐。但对于许多金融机构、军工单位或严格隔离的生产环境而言&a…...
题解:洛谷 AT_abc391_b [ABC391B] Seek Grid
本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…...
Claude读论文系列(十)
精读笔记:CoDe-R CoDe-R: Refining Decompiler Output with LLMs via Rationale Guidance and Adaptive Inference arXiv: 2604.12913 | cs.SE / cs.AI / cs.CR 会议:IJCNN 2026(已收录) 机构:未标注(第一作…...
