【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.hqwc.cn/news/650756.html

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

相关文章

Windows主机入侵检测与防御内核技术深入解析

第2章 模块防御的设计思想 2.1 执行与模块执行 本章内容为介绍模块执行防御。在此我将先介绍“执行”分类&#xff0c;以及“模块执行”在“执行”中的位置和重要性。 2.1.1 初次执行 恶意代码&#xff08;或者行为&#xff09;要在被攻击的机器上执行起来&#xff0c;看起…

SWOT分析法:知彼知己的战略规划工具

文章目录 一、什么是SWOT分析法二、SWOT分析法如何产生的三、SWOT分析法适合哪些人四、SWOT分析法的应用场景五、SWOT分析法的优缺点六、SWOT分析实例 一、什么是SWOT分析法 SWOT分析法是一种用于评估组织、项目、个人或任何其他事物的战略规划工具。SWOT是Strengths&#xff…

【巨大的错误】【歌词中找单词】【字符串斐波那契】

1. 巨大的错误 &#xff08;错排公式&#xff09; 想象一个原来有序的书架&#xff0c;每本书都有原本的位置&#xff0c;现在要改变他们的位置&#xff0c;让每本书的位置都不是原来的位置。 现在假设我们有n本书&#xff0c;要打乱他们的顺序: 第n本书需要放到前n-1个位置&a…

不对称催化(三)- 动态动力学拆分动态动力学不对称转化

一、动力学拆分的基本概念&#xff1a; 动力学拆分的最大理论产率为50%&#xff0c;通过的差异可以将两个对映异构体转化为不同构型的产物&#xff0c;通常情况下使用两个不同反应路径来实现。但是化学家们提供了一个更加实用的方法&#xff0c;通过底物的构型变化实现高于50%的…

如何解决公司内部小文件拷贝速度慢的问题?

​在当今大数据的洪流下&#xff0c;企业日常运作中频繁生成和处理的微小文件群&#xff0c;成为了一个不容忽视的挑战——尽管这些文件体积极小&#xff0c;其复制速度却出人意料地迟缓。小编将深入探讨这一现象的根源&#xff0c;并提出有效的策略&#xff0c;帮助企业破解这…

伪原创生成器:为你创作有价值的内容

伪原创生成器是一种现代写手必备的得力助手。无论您是写作新手还是经验丰富的老手&#xff0c;它都能帮助您快速生成有吸引力的文章&#xff0c;让您在竞争激烈的市场中脱颖而出。伪原创一键生成软件是一款让写作变得轻松且高效的神奇工具。它为写手们节省了大量的时间和精力&a…

适用于芯片行业的开发及管理工具:版本控制、持续集成、代码分析及项目管理工具介绍

3月28日-29日&#xff0c;2024国际集成电路展览会暨研讨会&#xff08;IIC Shanghai&#xff09;在上海成功举行。此次盛会汇聚了集成电路产业的众多领军企业&#xff0c;共同探寻和把握集成电路产业的发展脉络。 龙智携芯片研发及管理解决方案亮相展会&#xff0c;展示如何通…

静态链接lib库使用

lib库实际上分为两种&#xff0c;一种是静态链接lib库或者叫做静态lib库&#xff0c;另一种叫做动态链接库dll库的lib导入库或称为lib导入库。这两个库是不一样的&#xff0c;很多人都分不清楚&#xff0c;很容易混淆。 第一种是静态lib&#xff0c;包含了所有的代码实现的&am…

文旅IP孵化打造抖音宣传推广运营策划方案

【干货资料持续更新&#xff0c;以防走丢】 文旅IP孵化打造抖音宣传推广运营策划方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 文旅IP抖音运营方案 1. 项目背景与目标 - 背景&#xff1a…

Selenium IDE 常见错误笔记

错误1&#xff1a;Failed:Exceeded waiting time for new window to appear 2000ms 这个错误通常出现在第一次运行时&#xff0c;有两个原因&#xff1a; Firefox阻止了弹出式窗口&#xff0c;在浏览器设置里允许这个操作即可。 有些网站设置了反扒机制&#xff0c;脚本运行…

【TCP:可靠数据传输,快速重传,流量控制,TCP流量控制】

文章目录 可靠数据传输TCP&#xff1a;可靠数据传输TCP发送方事件快速重传流量控制TCP流量控制 可靠数据传输 TCP&#xff1a;可靠数据传输 TCP在IP不可靠服务的基础上建立了rdt 管道化的报文段 GBN or SR 累计确认&#xff08;像GBN&#xff09;单个重传定时器&#xff08;像…

SpringBoot Aop使用篇

Getting Started SpringBoot AOP的实践 AOP相关的概念&#xff1a; Aspect&#xff08;切面&#xff09;&#xff1a; Aspect 声明类似于 Java 中的类声明&#xff0c;在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。就是抽离出来的逻辑类&#xff0c;比如日志、权限…