stm32开发之threadx+netxduo(tcp 服务端使用记录)

前言

  1. 本篇需要用到threadx之动态内存的实现记录 里面的动态内存分配管理代码.
  2. 开发环境使用的stm32cubemx+clion组合
  3. 芯片使用的是stm32f407zgt6,网口使用的是lan8720,使用cubemx提供的lan8742也可以驱动,注意实际的网口与芯片的引脚

示例代码

tcp 服务端

/** Copyright (c) 2024-2024,shchl** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2024-4-8     shchl   first version*/
#include "includes.h"
#include "nx_tcp.h"#define     TCP_SERVER_STACK_SIZE       4096  /*任务栈大小*/
#define     TCP_SERVER_PRIORITY         4     /*优先级*/
#define     PACKET_SIZE                 1536 /*数据包大小*/
#define     POOL_SIZE                   ((sizeof(NX_PACKET) + PACKET_SIZE) * 16) /*数据包池大小(16个缓冲区)*/
#define     TCP_SERVER_IP               IP_ADDRESS(192, 168, 8, 9) /*本地ip*/
#define     TCP_SERVER_LISTEN_PORT      8080 /*监听端口*/
TX_THREAD tcp_server_thread;            /*tcp 服务线程*/
NX_PACKET_POOL tcp_server_pool;         /*数据包池*/
NX_IP tcp_server_ip;                    /*服务端ip,即本地ip*/
NX_TCP_SOCKET tcp_server_socket;        /*服务端socket*/
static ULONG error_counter = 0;         /*错误计数器(可用来排查问题出现位置)*/VOID thread_server_entry(ULONG thread_input);void tcp_server_connect_received(NX_TCP_SOCKET *socket_ptr, UINT port);void tcp_server_disconnect_received_callback(NX_TCP_SOCKET *socket);static UINT receive_socket_handle(NX_TCP_SOCKET *socket);static inline void status_check(UINT stat) {if (stat) {error_counter++;// todo }
}
/*** @brief tcp 服务线程创建*/
void app_task_tcp_server_thread_create() {tx_log("------------------app_task_tcp_server_thread_create start--------------------\r\n");UINT status;/* 创建server 线程.  */tx_thread_create(&tcp_server_thread,"tcp sever thread",thread_server_entry, 0,app_malloc(TCP_SERVER_STACK_SIZE),TCP_SERVER_STACK_SIZE,TCP_SERVER_PRIORITY,TCP_SERVER_PRIORITY,TX_NO_TIME_SLICE,TX_AUTO_START);/* 创建 packet 内存池(可以理解为分配一个大数组).  */status = nx_packet_pool_create(&tcp_server_pool,"server packet pool",PACKET_SIZE,app_malloc(POOL_SIZE),POOL_SIZE);status_check(status);/* 创建一个ip 实列. 内部会创建一个对应的线程 */status = nx_ip_create(&tcp_server_ip,"tcp server instance",TCP_SERVER_IP, 0xFFFFFF00UL, &tcp_server_pool,nx_stm32_eth_driver,/*对应的网卡驱动*/app_malloc(2048), /*ip 内存栈空间首地址*/2048,2);status_check(status);/* 开启 地址解析协议 并分配缓冲区. */status = nx_arp_enable(&tcp_server_ip, app_malloc(1024), 1024);status_check(status);/*开启 icmp 协议, 能通过ping 命令去检查ip */status = nxd_icmp_enable(&tcp_server_ip);status_check(status);/* 开启 tcp 处理 */status = nx_tcp_enable(&tcp_server_ip);tx_log("------------------app_task_tcp_server_thread_create finished--------------------\r\n");}VOID thread_server_entry(ULONG thread_input) {NX_PARAMETER_NOT_USED(thread_input);UINT status;ULONG actual_status;/* 确保 IP 实例已初始化。  */do {/* 等待 1 秒钟,让 内部 IP 线程完成其初始化。. */status = nx_ip_status_check(&tcp_server_ip,NX_IP_INITIALIZE_DONE,&actual_status,NX_IP_PERIODIC_RATE);} while (status != NX_SUCCESS);/* 创建socket */status = nx_tcp_socket_create(&tcp_server_ip,&tcp_server_socket,"Server Socket",NX_IP_NORMAL, /* IP服务类型 */NX_FRAGMENT_OKAY,/* 使能IP分段 */NX_IP_TIME_TO_LIVE, /*默认数据包生存时间*/PACKET_SIZE, /*这个参数对应到后面发送的数据包是否会进行分包处理*/NX_NULL, /* 用于在接收流中检测到紧急数据时调用的回调函数 */tcp_server_disconnect_received_callback  /* TCP Socket另一端发出断开连接时调用的回调函数 */);status_check(status);/*  监听新的链接。 */status = nx_tcp_server_socket_listen(&tcp_server_ip, /* IP实例控制块 */TCP_SERVER_LISTEN_PORT, /* 端口 */&tcp_server_socket,/* TCP Socket控制块 */5,/* 可以监听的连接数 */tcp_server_connect_received  /* 监听接收到连接函数 */);status_check(status);while (1) {/* 接受客户端套接字连接。(阻塞)  */status = nx_tcp_server_socket_accept(&tcp_server_socket, NX_WAIT_FOREVER);status_check(status);/*处理接收到的客户端连接*/receive_socket_handle(&tcp_server_socket);/* 断开服务器套接字。  */status = nx_tcp_socket_disconnect(&tcp_server_socket, NX_IP_PERIODIC_RATE);if (status) {error_counter++;}/* 解除Socket和服务器端口的绑定 */status = nx_tcp_server_socket_unaccept(&tcp_server_socket);status_check(status);/* 重新监听 */status = nx_tcp_server_socket_relisten(&tcp_server_ip,TCP_SERVER_LISTEN_PORT,&tcp_server_socket);status_check(status);}}void tcp_server_connect_received(NX_TCP_SOCKET *socket_ptr, UINT port) {/* Check for the proper socket and port.  */if ((socket_ptr != &tcp_server_socket) || (port != TCP_SERVER_LISTEN_PORT)) {error_counter++;} else {ULONG ipaddr = socket_ptr->nx_tcp_socket_connect_ip.nxd_ip_address.v4;tx_log("current ip: %lu.%lu.%lu.%lu:%d\r\n",(ipaddr >> 24) & 0xff, (ipaddr >> 16) & 0xff,(ipaddr >> 8) & 0xff, (ipaddr & 0xff), socket_ptr->nx_tcp_socket_port);}
}void tcp_server_disconnect_received_callback(NX_TCP_SOCKET *socket) {/* Check for proper disconnected socket.  */if (socket != &tcp_server_socket) {error_counter++;}
}/*** @brief 处理接收的socket* @param socket* @return*/
static UINT receive_socket_handle(NX_TCP_SOCKET *socket) {UINT status;NX_PACKET *packet_ptr;continue_rec:/* Receive a TCP message from the socket.  */status = nx_tcp_socket_receive(&tcp_server_socket, &packet_ptr, NX_IP_PERIODIC_RATE);/* Check for error.  */switch (status) {case NX_SUCCESS: {*packet_ptr->nx_packet_append_ptr = '\0'; /*在结尾处添加结束标志位,这里可以这样处理,前提是确保指向的位置可以被修改*/tx_log("data packet size:%d\r\n", packet_ptr->nx_packet_length);tx_log("nx_tcp_socket_receive data:%s\r\n", packet_ptr->nx_packet_prepend_ptr);/*处理完成之后释放数据包,这里需要我们自己进行释放*/nx_packet_release(packet_ptr);goto continue_rec; /*继续接收客户端*/}case NX_NO_PACKET: { /*客户端连接,但没有发送数据,这里可以做超时断开客户端连接操作*/// tx_log("nx_tcp_socket_receive NX_NO_PACKET\r\n");goto continue_rec; /*继续接收客户端*/}case NX_NOT_CONNECTED: {tx_log("client disconnected\r\n");break;}default: {tx_log("nx_tcp_socket_receive status:%d\r\n", status);break;}}return NX_SUCCESS;
}

调用主逻辑

在这里插入图片描述

结果

在这里插入图片描述
在这里插入图片描述

发送超过数据包大小

在这里插入图片描述

wireshark 数据查看

在这里插入图片描述

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

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

相关文章

Excel文本内容抽取工具[Python]

#创作灵感# 一堆Excel文件,每个打开看太累了。写个脚本直接显示里面的内容多好。最好这些内容可以直接复制到剪切板,方便以后编辑修改。只需要将文件拖动到全屏置顶的文本框内,就能弹出Excel里的内容。支持一次选取多个文件。 开干&#xff…

计算机视觉——引导APSF和梯度自适应卷积增强夜间雾霾图像的可见性算法与模型部署(C++/python)

摘要 在夜间雾霾场景中,可见性经常受到低光照、强烈光晕、光散射以及多色光源等多种因素的影响而降低。现有的夜间除雾方法常常难以处理光晕或低光照条件,导致视觉效果过暗或光晕效应无法被有效抑制。本文通过抑制光晕和增强低光区域来提升单张夜间雾霾…

N1922A是德科技N1922A功率传感器

181/2461/8938产品概述: N192XA 传感器是首款通过将直流参考源和开关电路集成到功率传感器中来提供内部调零和校准的传感器。此功能消除了与使用外部校准源相关的多个连接,从而最大限度地减少了连接器磨损、测试时间和测量不确定性。 连接到 DUT 时进行…

InsectMamba:基于状态空间模型的害虫分类

InsectMamba:基于状态空间模型的害虫分类 摘要IntroductionRelated WorkImage ClassificationInsect Pest Classification PreliminariesInsectMambaOverall Architecture InsectMamba: Insect Pest Classification with State Space Model 摘要 害虫分类是农业技术…

Excel从零基础到高手【办公】

第1课 - 快速制作目录【上篇】第1课 - 快速制作目录【下篇】第2课 - 快速定位到工作表的天涯海角第3课 - 如何最大化显示工作表的界面第4课 - 给你的表格做个瘦身第5课 - 快速定位目标区域所在位置第6课 - 快速批量填充序号第7课 - 按自定义的序列排序第8课 - 快速删除空白行第…

C++数据结构与算法——贪心算法难题

C第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更…

计算机视觉异常检测——PatchCore面向全召回率的工业异常检测

1. 概述 异常检测问题在工业图像数据分析中扮演着至关重要的角色,其目的是从大量正常数据中识别出异常行为或模式。这一任务的挑战在于,正常数据的样本相对容易获取,而异常情况却因其稀有性和多样性而难以收集。为了解决这一问题&#xff0c…

跟TED演讲学英文:Why AI will spark exponential economic growth by Cathie Wood

TED英文文稿 文章目录 TED英文文稿Why AI will spark exponential economic growthIntroductionVocabularyTranscriptSummary Why AI will spark exponential economic growth Link: https://www.ted.com/talks/cathie_wood_why_ai_will_spark_exponential_economic_growth? …

家庭网络防御系统搭建-将NDR系统的zeek日志集成到securit yonion

在前面的文章中安装了zeek,这里,安装了securityonion,这里,本文讲述如何将zeek生成的日志发送到siem security onion之中。 所有日志集成的步骤分为如下几步: 日志收集配置日志发送接收日志解析配置日志展示配置 ZEEK日志收集配…

大型语言模型如何助力推荐系统:综述研究

论文地址:https://arxiv.org/pdf/2306.05817.pdf 这篇论文主要探讨了推荐系统(RS)如何从大型语言模型(LLM)中获益。论文首先指出,随着在线服务和网络应用的快速发展,推荐系统已成为缓解信息过载…

路由器如何端口映射到外网?

随着互联网的发展和普及,远程访问已经成为了现代社会的一个重要需求。在复杂的网络环境下,特别是涉及异地组网的情况下,实现远程访问变得更加困难。本文将介绍一种名为【天联】的组网产品,它可以解决复杂网络环境下的远程连接问题…

搜维尔科技:Patchwork 3D工业仿真实时渲染,将CAD 数据转换成真实感的3D模型以用于工业用途

Patchwork 3D工业仿真 实时渲染点击跳转官网 从实时渲染到真实照片 根据工作阶段所需的逼真度,您可以使用三个渲染引擎,从最快的(OpenGL,交互式)到最逼真的(光线跟踪,Iray物理逼真)…

vue中使用axios获取不到响应头Content-Disposition的解决办法

项目中,后端返回的文件流; 前端需要拿到响应头里的Content-Disposition字段的值,从中获取文件名 在控制台Headers中可以看到相关的字段和文件名,但是在axios里面却获取不到 如果想要让客户端访问到相关信息,服务器不仅要在head…

web安全学习笔记【22】——文件上传(1)

WEB攻防-PHP应用&文件上传&函数缺陷&条件竞争&二次渲染&黑白名单&JS绕过 演示案例: PHP-原生态-文件上传-前后端验证PHP-原生态-文件上传-类型文件头验证PHP-原生态-文件上传-后缀黑白名单验证PHP-原生态-文件上传-解析配置&二次渲染…

XUbuntu22.04之Typora添加水印并输出pdf文件(二百二十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP…

功能测试_验证某城市电话号码的正确性

案例:验证某城市电话号码的正确性 功能测试_等价类设计用例: 步骤: 1:明确需求:电话号码是否正确 2:划分等价类:有效等价类、有效取值、无效等价类、无效取值 3:提取数据编写用例:用例编号…

STM32F407+FreeRTOS+LWIP UDP组播

开发环境介绍: MCU:STM32F407ZET6 网卡:LAN8720A LWIP版本:V1.1.0 FreeRTOS 版本:V10.2.1 LAN8720A硬件原理图: 硬件连接说明: MII_RX_CLK/RMII_REF_CLK ------>PA1 …

云安全在金融领域的作用是什么?

云安全在金融领域发挥着至关重要的作用,使金融机构能够保护敏感数据、遵守监管要求并推动创新。通过实施强有力的安全措施、利用先进技术并对新出现的威胁保持警惕,金融机构可以保护其数字资产并维持客户的信任。 金融机构面临的挑战 1.缺乏全网数据支撑…

不到6毛钱的I2C总线实时时钟日历芯片LK8563

前言 8563实时时钟芯片,国内外均有多家生产,今推荐一个性价比极高的RTC芯片,LK8563,一片不到6毛钱. 特点 基于32.768kHz晶体的秒,分,小时,星期,天,月和年的计时 带有世…

设计模式学习笔记 - 设计模式与范式 -行为型:7.责任链模式(下):框架中常用的过滤器、拦截器是如何实现的?

概述 上篇文章《6.责任链模式(上):原理与实现》,学习了职责链模式的原理与实现,并且通过一个敏感词过滤框架的例子,展示了职责链模式的设计意图。本质上来说,它跟大部分设计模式一样&#xff0…