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

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

测试结果

在这里插入图片描述

相关文章:

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&…...

哲理:为什么你要学习编程这项技能

有一家饭店的大厨&#xff0c;烧得一手好菜&#xff0c;经过口碑相传&#xff0c;客人从五湖四海闻名而来。然而这对饭店的老板来说&#xff0c;并不单纯是一个好消息。因为客人不是奔着饭店&#xff0c;而是奔着大厨的手艺来的。老板必须想办法留住这位大厨&#xff0c;否则他…...

【机器学习300问】30、准确率的局限性在哪里?

一、什么是准确率&#xff1f; 在解答这个问题之前&#xff0c;我们首先得先回顾一下准确率的定义&#xff0c;准确率是机器学习分类问题中一个很直观的指标&#xff0c;它告诉我们模型正确预测的比例&#xff0c;即 还是用我最喜欢的方式&#xff0c;举例子来解释一下&#xf…...

融资项目——网关微服务

1. 网关的路由转发功能 在前后端分离的项目中&#xff0c;网关服务可以将前端的相关请求转发到相应的后端微服务中。 2. 网关微服务的配置 首先需要创建一个网关微服务&#xff0c;并添加依赖。 <!-- 网关 --><dependency><groupId>org.springframework.cl…...

飞驰云联CEO朱旭光荣获“科技领军人才”称号

2024年2月29日&#xff0c;苏州工业园区“优化营商环境暨作风效能建设大会”成功举办&#xff0c;会上公布了2023年度苏州工业园区第十七届第一批金鸡湖科技领军人才名单&#xff0c;Ftrans飞驰云联创始人兼CEO朱旭光先生凭借在数据安全以及文件交换领域取得的突出成果&#xf…...

Dockerfile的使用,怎样制作镜像

Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build命令参数&#xff1a; --build-arg&#xff0c;设置构建时的变量 --no-cache&#xff0c;默认false。设置该选项&#xff0c;将不使用Build …...

外包干了5天,技术退步明显。。。。。

在湖南的一个安静角落&#xff0c;我&#xff0c;一个普通的大专生&#xff0c;开始了我的软件测试之旅。四年的外包生涯&#xff0c;让我在舒适区里逐渐失去了锐气&#xff0c;技术停滞不前&#xff0c;仿佛被时间遗忘。然而&#xff0c;生活的转机总是在不经意间降临。 与女…...

leetcode2834--找出美丽数组的最小和

1. 题意 求一个序列和。序列 a a a满足&#xff1a; 大小为 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,ij,ai​aj​target 找出美丽数组的最小和 2. 题解 贪心的构造这个序列。…...

【NR 定位】3GPP NR Positioning 5G定位标准解读(七)- GNSS定位方法

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…...

结构体和malloc学习笔记

结构体学习&#xff1a; 为什么会出现结构体&#xff1a; 为了表示一些复杂的数据&#xff0c;而普通的基本类型变量无法满足要求&#xff1b; 定义&#xff1a; 结构体是用户根据实际需要自己定义的符合数类型&#xff1b; 如何使用结构体&#xff1a; //定义结构体 struc…...

Nginx常用命令总结及常见问题排查

连续更新挑战第4天… 目录 常用启停命令Nginx 常见问题Nginx 如何忽略非标准http头检测?Nginx websocket代理Nginx 临时缓存不够导致下载文件失败Nginx 没有临时缓存目录权限导致下载文件失败Nginx非root用户启动无法使用80端口或者报无权限异常路由重写怎么配置?nginx 根据…...

微服务超大Excel文件导出方案优化

1、在导出Excel时经常会碰到文件过大&#xff0c;导出特别慢 2、微服务限制了请求超时时间&#xff0c;文件过大情况必然超时 优化思路&#xff1a; 1、文件过大时通过文件拆分、打包压缩zip&#xff0c;然后上传到oss,并设置有效期&#xff08;30天过期&#xff09; 2、把…...

论文阅读之Multimodal Chain-of-Thought Reasoning in Language Models

文章目录 简介摘要引言多模态思维链推理的挑战多模态CoT框架多模态CoT模型架构细节编码模块融合模块解码模块 实验结果总结 简介 本文主要对2023一篇论文《Multimodal Chain-of-Thought Reasoning in Language Models》主要内容进行介绍。 摘要 大型语言模型&#xff08;LLM…...

灯塔:CSS笔记(2)

一 选择器进阶 后代选择器&#xff1a;空格 作用&#xff1a;根据HTML标签的嵌套关系&#xff0c;&#xff0c;选择父元素 后代中满足条件的元素 选择器语法&#xff1a;选择器1 选择器2{ css } 结果&#xff1a; *在选择器1所找到标签的后代&#xff08;儿子 孙子 重孙子…...

基于Springboot的志愿服务管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的志愿服务管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…...

保姆级讲解 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二识

图片&#xff0c;音频&#xff0c;视频标签 标签描述<img>定义图片<audio>定义音频<video>定义视频 定义图片&#xff1a; src&#xff1a;规定显示图片的URL&#xff08;统一资源定位符&#xff09;height&#xff1a;定义图像的高度 单位&#xff1a;px…...

[BUUCTF]-PWN:starctf_2019_babyshell解析(汇编\x00开头绕过+shellcode)

查看保护 查看ida 这里就是要输入shellcode&#xff0c;但是函数会有检测。 在shellcode前面构造一个以\x00机器码开头的汇编指令&#xff0c;这样就可以绕过函数检查了。 完整exp&#xff1a; from pwn import* context(log_leveldebug,archamd64) pprocess(./babyshell)she…...

uniapp 手写 简易 时间轴 组件

一、案例如图 该案例设计条件&#xff1a; 左侧时间 和竖线、点、内容都是居中对其的&#xff0c;上下时间点中间要有一段距离 二、编写逻辑 1. 布局结构&#xff1a;一共三个元素&#xff0c;左侧是时间和黑点&#xff0c;中间是线条&#xff0c;右侧是内容 2. 样式难点&#…...

实现HttpServletRequest下多次获取流数据

HttpServletRequest下多次获取流数据 背景示例错误的尝试全局替换执行顺序 背景 ​众所周知request的输入流只能读取一次&#xff0c;不能重复读取。而在HttpServletRequest中&#xff0c;获取请求体数据的流&#xff08;通过getInputStream()方法&#xff09;默认只能被读取一…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...