【STM32F407+CUBEMX+FreeRTOS+lwIP之TCP记录】

STM32F407+CUBEMX+FreeRTOS+lwIP之TCP记录

  • 注意
  • TCP client(socket)
    • 示例
  • TCP_server(socket)
    • 效果

注意

如果连接失败,建议关一下代理软件。
配置方面可以参考一下上一篇UDP的文章
STM32F407+CUBEMX+FreeRTOS+lwIP之UDP记录

TCP client(socket)

#define LWIP_DEMO_PORT 8081
#define LWIP_DEMO_RX_BUFSIZE         200    /* 最大接收数据长度 */
#define IP_ADDR   "192.168.123.92"/*client 服务端ip*/
osThreadId_t socket_tcp_TaskHandle;
const osThreadAttr_t socket_tcp_Task_attributes = {.name = "socket_tcp_Task",.stack_size = 128 * 8,.priority = (osPriority_t) (osPriorityNormal-9),
};
void Start_socket_tcp_Task(void *argument);
/* 数据发送标志位 */
uint8_t g_lwip_send_flag;
int g_lwip_sock = -1;
int g_lwip_connect_state = 0;
socket_tcp_TaskHandle = osThreadNew(Start_socket_tcp_Task, NULL, &socket_tcp_Task_attributes);

lwip初始化后加点延时再连接

void Start_socket_tcp_Task(void *argument){	vTaskDelay(1000);vTaskDelay(1000);vTaskDelay(1000);struct sockaddr_in atk_client_addr;err_t err;char g_lwip_demo_sendbuf[] = "ALIENTEK DATA \r\n";g_lwip_connect_state = 0;/*tcp client*/atk_client_addr.sin_family = AF_INET;                   /* 表示IPv4网络协议 */atk_client_addr.sin_port = htons(LWIP_DEMO_PORT);       /* 端口号 */atk_client_addr.sin_addr.s_addr = inet_addr(IP_ADDR);   /* 远程IP地址 *//**/g_lwip_sock = socket(AF_INET, SOCK_STREAM, 0);          /* 可靠数据流交付服务既是TCP协议 */if(g_lwip_sock<0){printf("socket failed\n");}printf("g_lwip_sock %d\n",g_lwip_sock);memset(&(atk_client_addr.sin_zero), 0, sizeof(atk_client_addr.sin_zero));/*tcp client*/
sock_start:	/* 连接远程IP地址 */err = connect(g_lwip_sock, (struct sockaddr *)&atk_client_addr, sizeof(struct sockaddr));/**/if (err == -1){printf("连接失败\r\n");g_lwip_sock = -1;closesocket(g_lwip_sock);vTaskDelay(10);goto sock_start;}printf("连接成功\r\n");g_lwip_connect_state = 1;g_lwip_send_flag=1;while (1){if(((g_lwip_send_flag) == 1) && (g_lwip_connect_state == 1)) /* 有数据要发送 */{err = write(g_lwip_sock, g_lwip_demo_sendbuf, sizeof(g_lwip_demo_sendbuf));if (err < 0){break;}g_lwip_send_flag=0;}vTaskDelay(10);}
void lwip_recv_Task(void *argument){BaseType_t lwip_err;struct sockaddr_in sender;int sender_len = sizeof(sender);while(1){#ifdef lwip_socket_udpmemset(g_lwip_demo_recvbuf, 0, sizeof(g_lwip_demo_recvbuf));
//		recv(sock_fd, (void *)g_lwip_demo_recvbuf, sizeof(g_lwip_demo_recvbuf), 0);recvfrom(sock_fd, (void *)g_lwip_demo_recvbuf, sizeof(g_lwip_demo_recvbuf), 0,(struct sockaddr*)&sender,(socklen_t *)&sender_len);#endif#ifdef lwip_socket_tcprecvfrom(g_lwip_sock, (void *)g_lwip_demo_recvbuf, sizeof(g_lwip_demo_recvbuf), 0,(struct sockaddr*)&sender,(socklen_t *)&sender_len);
//		recv(g_lwip_sock,g_lwip_demo_recvbuf,
//                                 LWIP_DEMO_RX_BUFSIZE,0);#endif/*IP*/printf("%s %d \n", inet_ntoa(sender.sin_addr), ntohs(sender.sin_port));printf("%s\n",g_lwip_demo_recvbuf);write(g_lwip_sock, g_lwip_demo_recvbuf, vTaskDelay(10);}
}

示例

在这里插入图片描述

TCP_server(socket)

void Start_socket_tcp_Task(void *argument){	vTaskDelay(1000);vTaskDelay(1000);vTaskDelay(1000);struct sockaddr_in atk_client_addr;err_t err;char g_lwip_demo_sendbuf[] = "ALIENTEK DATA \r\n";struct sockaddr_in conn_addr;   /* 连接地址 */socklen_t addr_len;             /* 地址长度 */int length;int g_sock_conn;g_lwip_connect_state = 0;g_lwip_sock = socket(AF_INET, SOCK_STREAM, 0);          /* 可靠数据流交付服务既是TCP协议 */
/*tcp server*/memset(&atk_client_addr, 0, sizeof(atk_client_addr));        /* 将服务器地址清空 */atk_client_addr.sin_family = AF_INET;                   /* 表示IPv4网络协议 */atk_client_addr.sin_port = htons(LWIP_DEMO_PORT);       /* 端口号 */atk_client_addr.sin_addr.s_addr = htonl(INADDR_ANY);;   /* 远程IP地址 */err = bind(g_lwip_sock, (struct sockaddr *)&atk_client_addr, sizeof(atk_client_addr)); /* 建立绑定 */printf("err1 %d\n",err);if (err < 0)                /* 如果绑定失败则关闭套接字 */{printf("bind failed\n");closesocket(g_lwip_sock);   /* 关闭套接字 */}err = listen(g_lwip_sock, 4);   /* 监听连接请求 */if (err < 0)                /* 如果监听失败则关闭套接字 */{printf("listen failed\n");closesocket(g_lwip_sock);   /* 关闭套接字 */}printf("err2 %d\n",err);
/*tcp server*/printf("tcp server \n");while(1){printf("while 1 \n");addr_len = sizeof(struct sockaddr_in); /* 将链接地址赋值给addr_len */printf("addr_len \n");g_sock_conn = accept(g_lwip_sock, (struct sockaddr *)&conn_addr, &addr_len); /* 对监听到的请求进行连接,状态赋值给g_sock_conn */printf("g_sock_conn \n");if (g_sock_conn < 0) /* 状态小于0代表连接故障,此时关闭套接字 */{closesocket(g_lwip_sock);printf("closesocket \n");}else {g_lwip_connect_state = 1;}while(1){printf("while 2 \n");memset(g_lwip_demo_recvbuf,0,LWIP_DEMO_RX_BUFSIZE);length = recv(g_sock_conn, (unsigned int *)g_lwip_demo_recvbuf, sizeof(g_lwip_demo_recvbuf), 0); /* 将收到的数据放到接收Buff */if (length <= 0){goto atk_exit;}printf("%s",g_lwip_demo_recvbuf);vTaskDelay(10);
//			lwip_err = xQueueSend(g_display_queue,&g_lwip_demo_recvbuf,0);//			if (lwip_err == errQUEUE_FULL)
//			{
//				printf("队列Key_Queue已满,数据发送失败!\r\n");
//			}}atk_exit:if (g_sock_conn >= 0){          closesocket(g_sock_conn);g_sock_conn = -1;}printf("atk_exit \n");}

效果

在这里插入图片描述

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

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

相关文章

【C语言__指针02__复习篇12】

目录 前言 一、数组名的理解 二、使用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 前言 本篇主要讨论以下问题&#xff1a; 1. 数组名通常表示什么&#xff0c;有哪两种例外情况&#xff0c;在例外情况中…

【论文浅尝】Phi-3-mini:A Highly Capable Language Model Locally on Your Phone

Phi-3-mini phi-3-mini&#xff0c;一个3.8亿个参数的语言模型&#xff0c;训练了3.3万亿个token&#xff0c;其总体性能&#xff0c;通过学术基准和内部测试进行衡量&#xff0c;可以与Mixtral 8x7B和GPT-3.5等模型相媲美(在MMLU上达到69%&#xff0c;在MT-bench上达到8.38)&…

Maya vs Blender:制作3D动画首选哪一个?

就 3D 动画而言&#xff0c;有两款3D软件引发了最多的争论&#xff1a;Blender 与 Maya。这两个强大的平台都提供强大的工具集&#xff0c;使动画故事和角色栩栩如生。但作为一名3D动画师&#xff0c;您应该投入时间学习和创作哪一个呢&#xff1f;下面我将从以下六点给您一个清…

用Python将原始边列表转换为邻接矩阵

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在图论和网络分析中&#xff0c;图是一种非常重要的数据结构&#xff0c;它由节点&#xff…

C++感受6-Hello World 交互版

变量、常量输入、输出、流getline() 函数读入整行输入Hello() 函数复习新定义函数 Input() 实现友好的人机交互还有 “痘痘” 为什么挤不到的分析…… 1. DRY 原则简介 上一节课&#xff0c;我们写了两版“问候”程序。第一版的最大问题是重复的内容比较多&#xff0c;每一次问…

运行django

确保app被注册 urls.py中编写url 视图对应关系 命令行启动 python manage.py runserver

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城

源码下载地址&#xff1a;完美运营版商城.zip 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本

Python浅谈清朝秋海棠叶版图

1、清朝疆域概述&#xff1a; 清朝是我国最后一个封建王朝&#xff0c;其始于1616年建州女真部努尔哈赤建立后金&#xff0c;此后统一女真各部、东北地区。后又降服漠南蒙古&#xff0c;1644年入关打败农民起义军、灭南明&#xff0c;削三藩&#xff0c;复台湾。后又收外蒙&am…

网络安全之防范钓鱼邮件

随着互联网的快速发展&#xff0c;新的网络攻击形式“网络钓鱼”呈现逐年上升的趋势&#xff0c;利用网络钓鱼进行欺骗的行为越来越猖獗&#xff0c;对互联网的安全威胁越来越大。网络钓鱼最常见的欺骗方式就是向目标群体发送钓鱼邮件&#xff0c;而邮件标题和内容&#xff0c;…

Qt配置CMake出错

一个项目需要在mingw环境下编译Opencv源码&#xff0c;当我用Qt配置opencv的CMakeLists.txt时&#xff0c;出现了以下配置错误&#xff1a; 首先我根据下述博文介绍&#xff0c;手动配置了CMake&#xff0c;但仍不能解决问题。 Qt(MinGW版本)安装 - 夕西行 - 博客园 (cnblogs.…

使用CNN实现新闻文本分类

一、实验目的&#xff1a; 理解卷积神经网络的基本概念和原理&#xff1b;了解卷积神经网络处理文本数据的基本方法&#xff1b;掌握卷积神经网络处理文本数据的实践方法&#xff0c;并实现新闻文本的分类任务。 实验要求&#xff1a; 使用Keras框架定义并训练卷积神经网络模…

【BFPTR】震惊!竟然还有比 快速排序 更快的算法...

在介绍 堆 和 加强堆 的文章中&#xff0c;我们探讨了当有新的元素加入时&#xff0c;如何实时更新前 K 个元素的方法。 &#xff08;还没学习过的小伙伴赶快关注&#xff0c;在 「堆」 合集里查看哦&#xff01;&#xff09; 今天我们介绍一种新的方法&#xff0c;使用 bfp…

【云计算】云数据中心网络(七):负载均衡

《云网络》系列&#xff0c;共包含以下文章&#xff1a; 云网络是未来的网络基础设施云网络产品体系概述云数据中心网络&#xff08;一&#xff09;&#xff1a;VPC云数据中心网络&#xff08;二&#xff09;&#xff1a;弹性公网 IP云数据中心网络&#xff08;三&#xff09;…

QT C++ sqlite 对多个数据库的操作

//本文描述&#xff0c;QT 对多数据库的操作。 //你可能会想&#xff0c;多数据库的操作时&#xff0c;查询语句怎么知道是哪个数据库。 //QT提供了这样一种构造函数 QSqlQuery(const QSqlDatabase &db) //指定数据库 //在QT6.2.4 MSVC2019调试通过。 //效果见下图&am…

uniapp对uni.request()的封装以及使用

官方文档 uni.request(OBJECT) | uni-app官网 (dcloud.net.cn) uni.request参数 参数名说明url是写api地址的data是用来传值的对于 GET 方法&#xff0c;会将数据 转换为 query string。例如 { name: name, age: 18 } 转换后的结果是 namename&age18。对于 POST 方法且 …

项目管理中常用的三个工具:甘特图、看板、燃尽图

在日常项目管理的实践中&#xff0c;为了更有效地追踪项目进度、优化资源配置和提高团队协作效率&#xff0c;管理者常常会借助一些工具来辅助工作。这些工具的本质在于将抽象复杂的项目管理任务具象化、简单化&#xff0c;以更直观、方便的方式呈现出来。 以下介绍项目管理中…

【opencv 加速推理】如何安装 支持cuda的opencv 包 用于截帧加速

要在支持CUDA的系统上安装OpenCV&#xff0c;您可以使用pip来安装支持CUDA的OpenCV版本。OpenCV支持CUDA加速&#xff0c;但需要安装额外的库&#xff0c;如cuDNN和NVIDIA CUDA Toolkit。以下是一般步骤&#xff1a; 安装NVIDIA CUDA Toolkit: 首先&#xff0c;您需要安装NVID…

【学习笔记】Python 使用 matplotlib 画图

文章目录 安装中文显示折线图、点线图柱状图、堆积柱状图坐标轴断点参考资料 本文将介绍如何使用 Python 的 matplotlib 库画图&#xff0c;记录一些常用的画图 demo 代码 安装 # 建议先切换到虚拟环境中 pip install matplotlib中文显示 新版的 matplotlib 已经支持字体回退…

【Linux】常用命令

1. 切换命令: cd 语法&#xff1a; cd [相对路径或绝对路径] 使用小tips: 输入文件夹名称过程中可以使用Tab来自动不全。 演示效果&#xff1a; 使用了相对路径和绝对路径&#xff0c;可以看到它们的效果是一样的。 2. 创建目录&#xff1a;mkdir 语法&#xff1a; mkdir […

OpenHarmony音视频—opus

简介 Opus是一种用于在互联网上进行交互式语音和音频传输的编解码器。它可以从低比特率窄带语音扩展到非常高的高品质立体声音乐。 下载安装 直接在OpenHarmony-SIG仓中搜索opus并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的opus库代码存在以下路径&a…