Lwip之TCP客户端示例记录

前言

  1. 使用两个线程作为客户端中的收和发
  2. 使用线程挂起和线程恢复的api来实现
  3. 接收线程必须要保证在处理连接状态才能进行接收。

Demo

//
// Created by shchl on 2024/3/8.
//
#include <string.h>
#include "lwip/api.h"
#include "FreeRTOS.h"
#include "task.h"#define TCP_CLIENT_RX_BUFSIZE 256static void tcp_client_send(void *);static void tcp_client_rec(void *);static TaskHandle_t client_send_handle;
static TaskHandle_t client_rec_handle;
static ip_addr_t server_ipaddr, loca_ipaddr;
static uint16_t server_port = 8080;
static struct netconn *tcp_conn;
static uint8_t tcp_client_recvbuf[TCP_CLIENT_RX_BUFSIZE] = {0};    //TCP客户端接收数据缓冲区void create_netconn_tcp_client_thread() {xTaskCreate((TaskFunction_t) tcp_client_send,(const char *) "tcp_client_send",(uint16_t) 256,(void *) NULL,(UBaseType_t) 10,(TaskHandle_t *) &client_send_handle);xTaskCreate((TaskFunction_t) tcp_client_rec,(const char *) "tcp_client_rec",(uint16_t) 256,(void *) NULL,(UBaseType_t) 11,(TaskHandle_t *) &client_rec_handle);}const char *tcp_client_sendbuf = "Apollo STM32F4/F7 NETCONN TCP Client send data\r\n";    //TCP客户端发送数据缓冲区
static void tcp_client_send(void *arg) {err_t err, recv_err;IP4_ADDR(&server_ipaddr, 192, 168, 8, 2);while (1) {tcp_conn = netconn_new(NETCONN_TCP);  //创建一个TCP链接err = netconn_connect(tcp_conn, &server_ipaddr, server_port);//连接服务器if (err != ERR_OK) {netconn_delete(tcp_conn); //返回值不等于ERR_OK,删除tcp_clientconn连接printf("连接失败....等待重新连接\r\n");vTaskDelay(1000);continue;} else {vTaskResume(client_rec_handle);/*恢复接收线程*/printf("连接...ok\r\n");}while (1) {err = netconn_write(tcp_conn, tcp_client_sendbuf, strlen((char *) tcp_client_sendbuf),NETCONN_COPY); //发送tcp_server_sentbuf中的数据if (err != ERR_OK) {printf("发送失败\r\n");netconn_close(tcp_conn);netconn_delete(tcp_conn);break;}vTaskDelay(1000);}}
}static void tcp_client_rec(void *arg) {err_t recv_err;uint32_t data_len;struct pbuf *q;struct netbuf *recvbuf;vTaskSuspend(client_rec_handle); /*挂起自身线程*/while (1) {if ((recv_err = netconn_recv(tcp_conn, &recvbuf)) == ERR_OK)  //接收到数据{portDISABLE_INTERRUPTS(); //关中断memset(tcp_client_recvbuf, 0, TCP_CLIENT_RX_BUFSIZE);  //数据接收缓冲区清零for (q = recvbuf->p; q != NULL; q = q->next)  //遍历完整个pbuf链表{//判断要拷贝到TCP_CLIENT_RX_BUFSIZE中的数据是否大于TCP_CLIENT_RX_BUFSIZE的剩余空间,如果大于//的话就只拷贝TCP_CLIENT_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据if (q->len > (TCP_CLIENT_RX_BUFSIZE - data_len))memcpy(tcp_client_recvbuf + data_len, q->payload, (TCP_CLIENT_RX_BUFSIZE - data_len));//拷贝数据else memcpy(tcp_client_recvbuf + data_len, q->payload, q->len);data_len += q->len;if (data_len > TCP_CLIENT_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出}portENABLE_INTERRUPTS(); //关中断data_len = 0;  //复制完成后data_len要清零。printf("%s", tcp_client_recvbuf);netbuf_delete(recvbuf);} else if (recv_err == ERR_CLSD)  //关闭连接{printf("服务器%d.%d.%d.%d断开连接\r\n", 192, 168, 8, 2);vTaskSuspend(client_rec_handle); /*挂起自身线程*/}}
}

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

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

相关文章

vue3运行npm create vue@latest卡住不动

问题&#xff1a;执行npm create vuelatest卡住一动不动 解决办法&#xff1a;更换npm镜像 旧的镜像可能都是这个 https://registry.npm.taobao.org/执行下面的指令&#xff1a;更换成这个 npm config set registryhttps://registry.npmmirror.com

5 一个能直接运行的Ninja例子,build.ninja文件怎么写?

一个能直接运行的Ninja例子&#xff0c;build.ninja文件怎么写&#xff1f; 作者将狼才鲸创建日期2024-03-08 CSDN文章阅读地址Gitee源码和工程下载地址 如果你使用的是Windows MSYS2 MinGW64 已提前安装过gccmsys2命令行中使用 pacman -S mingw-w64-x86_64-ninja 安装Ninj…

Python爬虫——scrapy-4

免责声明 本文章仅用于学习交流&#xff0c;无任何商业用途 部分图片来自尚硅谷 meta简介 在Scrapy框架中&#xff0c;可以使用meta属性来传递额外的信息。meta属性可以在不同的组件之间传递数据&#xff0c;包括爬虫、中间件和管道等。 在爬虫中&#xff0c;可以使用meta属…

7-4 哲哲打游戏(Python)

哲哲是一位硬核游戏玩家。最近一款名叫《达诺达诺》的新游戏刚刚上市&#xff0c;哲哲自然要快速攻略游戏&#xff0c;守护硬核游戏玩家的一切&#xff01; 为简化模型&#xff0c;我们不妨假设游戏有 N 个剧情点&#xff0c;通过游戏里不同的操作或选择可以从某个剧情点去往另…

二叉树算法题

树的初始化 类包含左右节点属性以及val值。 class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val x;} } 二叉树的中序遍历。 public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res new ArrayList<Integer>…

SQL 的优化手段

目录 1. 索引优化 2. 查询优化 3. SQL语句书写习惯 4. 数据库结构优化 5. 缓存策略 6. 批量操作 7. 服务器硬件和配置 8. 使用执行计划分析 9. 避免锁竞争 10. 其他优化手段 1. 索引优化 使用索引 创建合适的索引可以显著提高查询速度。为经常需要搜索的列、作为查询…

rabbitmq4

独占队列&#xff1a;我们的队列只能被当前通道所绑定&#xff0c;不能被其他的连接所绑定&#xff0c;如果有其他的通道或连接再使用此队列的话&#xff0c;会直接报错&#xff0c;一般设置为false&#xff1a; autoDelete&#xff1a;消费者在消费完队列&#xff0c;并且彻底…

20 卷积层里的填充和步幅【李沐动手学深度学习v2课程笔记】

1. 填充和步幅 在上下左右分别填充一些0 2. 代码实现 2.1 填充 我们创建一个高度和宽度为3的二维卷积层&#xff0c;并在所有侧边填充1个像素。给定高度和宽度为8的输入&#xff0c;则输出的高度和宽度也是8。 import torch from torch import nn# 为了方便起见&#xff0c;…

第三百八十九回

文章目录 1. 概念介绍2. 使用方法2.1 获取所有时区2.2 转换时区时间 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享一些好的Flutter站点"相关的内容&#xff0c;本章回中将介绍timezone包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

LeetCode 2482.行和列中一和零的差值

给你一个下标从 0 开始的 m x n 二进制矩阵 grid 。 我们按照如下过程&#xff0c;定义一个下标从 0 开始的 m x n 差值矩阵 diff &#xff1a; 令第 i 行一的数目为 onesRowi 。 令第 j 列一的数目为 onesColj 。 令第 i 行零的数目为 zerosRowi 。 令第 j 列零的数目为 zer…

el-form-item内的el-select如何自适应宽度

最近在使用element-ui做后台管理的时候&#xff0c;有个需求是在弹窗组件里面&#xff0c;添加一个el-select下拉框选项&#xff0c;但是给el-select设置的宽度无法自适应&#xff0c;原因很简单&#xff0c;我们不需要设置固定宽度&#xff0c;设置百分比就行了&#xff0c;让…

AI中大模型的文件格式有哪些?

环境&#xff1a; 大模型 问题描述&#xff1a; AI中大模型的文件格式有哪些&#xff1f; 解决方案&#xff1a; 大型机器学习模型&#xff0c;例如在自然语言处理、图像识别或其他领域的模型&#xff0c;可能会被保存和分发在多种不同的文件格式中。以下是一些常见的格式…

js 中的一些知识

1.js 往本地内存中写数据 localStorage.setItem(key, value); // 使用localStorage存储数据 sessionStorage.setItem(key, value);// 使用sessionStorage存储数据 let value localStorage.getItem(key); // 读取localStorage数据 let value sessionStorage.getItem(key);…

【框架设计】MVC、MVP、MVVM对比图

1. MVC&#xff08;Model-View-Controller&#xff09; 2. MVP&#xff08;Model-View-Presenter&#xff09; 3. MVVM&#xff08;Model-View-ViewModel&#xff09;

Golang基于Redis bitmap实现布隆过滤器(完结版)

Golang基于Redis bitmap实现布隆过滤器&#xff08;完结版&#xff09; 为了防止黑客恶意刷接口&#xff08;请求压根不存在的数据&#xff09;&#xff0c;目前通常有以下几种做法&#xff1a; 限制IP&#xff08;限流&#xff09;Redis缓存不存在的key布隆过滤器挡在Redis前 …

golang 协程 (goroutine) 与通道 (channel)

golang的协程和通道&#xff0c;之前就看过了&#xff0c;一直没有很好的理解&#xff0c;所以一直也没记录&#xff0c;今天看书&#xff0c;看到有一个总结的章节&#xff0c;里面记录了一些注意事项&#xff0c;因此写个文档&#xff0c;记录一下&#xff0c;避免以后自己忘…

对simplex算法的时间复杂度进行分析

对于simplex算法,如果每进行一次pivot变换,目标函数所得到的结果都会有可能出现增加的情况,所以得到的结论中,可以肯定它的值是一定不会出现减少的情况的,每次从目标函数中找到一个系数大于0的变量,然后再在约束条件中选取能够让它的增值最少的那个来继续进行pivot变换。…

linux kernel物理内存概述(五)

目录 概述 一、快速路径分配 1、get_page_from_freelist 2、rmqueue()函数 二、慢速路径分配 1、分配流程 三、direct_compact 概述 物理内存分配步骤 1、初始化,参数初始化 2、内存充足&#xff0c;快速分配 get_page_from_freelist 3、内存压力大&#xff0c;慢速…

程序员有哪些常用的技术网站呢?

在当今信息化时代&#xff0c;程序员们能够通过互联网接触到许多优秀的技术网站&#xff0c;这些网站为他们提供了丰富的学习资源和交流平台。这些技术网站涵盖了各种软件开发、设计、数据分析和人工智能等领域&#xff0c;为程序员们提供了广阔的学习空间和交流机会。在这篇文…

openCV保存图像

保存图像 //保存为png透明通道vector<int>opts;opts.push_back(IMWRITE_PAM_FORMAT_RGB_ALPHA);imwrite("D:/img_bgra.png", img, opts);//保存为单通道灰度图像img cv::imread(imagePath.toStdString(), IMREAD_GRAYSCALE);vector<int> opts_gray;opts…