【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_udp
		memset(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_tcp
		recvfrom(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");
	}

效果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【介绍下如何使用CocoaPods】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

chrome浏览器安装elasticsearch的head可视化插件

head插件简介 elasticsearch-head被称为是弹性搜索集群的web前端&#xff0c;head插件主要是用来和elastic Cluster交互的Web前端 head插件历史 elasticsearch-head插件在0.x-2.x版本的时候是集成在elasticsearch内的&#xff0c;由elasticsearch的bin/elasticsearch-plugin…

ChatGPT/GLM API使用

模型幻觉问题 在自然语言处理领域&#xff0c;幻觉&#xff08;Hallucination&#xff09;被定义为生成的内容与提供的源内容无关或不忠实&#xff0c;具体而言&#xff0c;是一种虚假的感知&#xff0c;但在表面上却似乎是真实的。产生背景 检索增强生成&#xff08;RAG&…

LT9611UXC双端口 MIPI DSI/CSI 转 HDMI2.0,带音频

1. 说明 LT9611UXC 是一款高性能 MIPI DSI/CSI 至 HDMI2.0 转换器。MIPI DSI/CSI 输入具有可配置的单端口或双端口&#xff0c;具有 1 个高速时钟通道和 1~4 个高速数据通道&#xff0c;工作速率最高为 2Gbps/通道&#xff0c;可支持高达 16Gbps 的总带宽。 LT9611UXC 支持突发…

MemFire解决方案-物联网数据平台解决方案

方案背景 随着各种通讯、传感技术发展&#xff0c;数据通讯成本的急剧下降&#xff0c;数以万亿计的智能设备&#xff08;智能手环、智能电表、智能手机、各种传感器设备等&#xff09;接入网络&#xff0c;并源源不断的产生海量的实时数据。这些海量数据的价值挖掘&#xff0…

美国言语听力学会(ASHA)关于非处方 (OTC) 助听器的媒体声明(翻译稿)

美国国会于 2021 年 4 月 13 日批准美国听力学会积极提供建议&#xff0c;并一直积极参与制定FDA关于非处方助听器销售的拟议法规。根据2017年通过的立法授权。学院积极参与帮助塑造授权立法&#xff0c;并就即将出台的条例分享了建议。 根据美国卫生与公众服务部NIH / NIDCD的…

软件工程的介绍

软件工程 这一章的内容其实还是蛮多的,大概一共有10个章节,分别是下面的一些内容,但是呢,这一章的内容其实是比较偏向文科类的,也就是说,记忆的内容其实占有很大的篇幅,在该考试科目当中呢,其实也是主要影响上午题部分的选择题的考察,基本的分值呢,在10分左右,分值占…

采购数据分析驾驶舱分享,照着它抄作业

今天我们来看一张采购管理驾驶舱。这是一张充分运用了多种数据可视化图表、智能分析功能&#xff0c;从物料和供应商的角度全面分析采购情况的BI数据可视化报表&#xff0c;主要分为三个部分&#xff0c;接下来就分部分来了解一下。 第一部分&#xff1a;关键指标计算及颜色预…

【linux高性能服务器编程】项目实战——仿QQ聊天程序源码剖析

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之项目实战——仿QQ聊天程序源码剖析&#xff0c;在这篇文章中&#xff0c;你将会学习到如何利用Linux网络编程技术来实现一个简单的聊天程序&#xff0c;并且我会给出源码进行剖析&#xff…

goroutinue和channel

goroutinue和channel 需求传统方式实现goroutinue进程和线程说明并发和并行go协程和go主线程MPG设置Go运行的cpu数 channel(管道)-看个需求使用互斥锁、写锁channel 实现 使用select可以解决从管道取数据的阻塞问题&#xff08;无需手动关闭channel了&#xff09;goroutinue中使…

【网络原理】TCP协议的连接管理机制(三次握手和四次挥手)

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序&#xff08;万字博文&#xff09; 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制&#xff08;CRC算法、MD5算法&#xff09; 【网络…

SkyWalking 自定义Span并接入告警

图容易被CSDN吞掉&#xff0c;我在掘金也发了&#xff1a;https://juejin.cn/post/7361821913398837248 我就是这么膨胀 最近在做 OpenAI API 套壳&#xff0c;当我使用 okhttp-sse 这个库进行流式内容转发的时候&#xff0c;我发现有些回调方法 SkyWalking 不能抓取到。这就…

JS面试题汇总(十)

JavaScript 的数据对象有那些属性值&#xff1f; writable&#xff1a;这个属性的值是否可以改。 configurable&#xff1a;这个属性的配置是否可以删除&#xff0c;修改。 enumerable&#xff1a;这个属性是否能在 for…in 循环中遍历出来或在 Object. keys 中列举出来。 …

小程序评分/关键词/UV优化助力小程序登顶

随着小程序市场的日益繁荣&#xff0c;小程序搜索排名优化成为了众多开发者关注的焦点。小程序搜索排名被很多因素影响着&#xff0c;关键词、评分还有uv&#xff08;授权&#xff09;等。在本文小柚和各位老板分享如何有效优化小程序搜索排名的经验。 一、关键词策略 关键词是…

[最新]CentOS7设置开机自启动Hadoop集群

安装好Hadoop后我们可以使用开机自启动的方式&#xff0c;节约敲命令的时间。注意是centOS7版本!!!和centOS6版本区别非常大!!! 1、切换到系统目录 [rootmaster ~]# cd /etc/systemd [rootmaster systemd]# ll total 32 -rw-r--r-- 1 root root 720 Jun 30 23:11 bootcha…

汽车新智能图谱里:理解腾讯的AI TO B路径

将自身的C2B产品和产业理解充分AI化&#xff0c;在自身内部场景率先验证跑通后&#xff0c;进而释放给产业伙伴&#xff0c;对应到具体的需求痛点&#xff0c;一起打磨对应的行业AI模型。 这也恰是腾讯“实用”标签背后的AI产业路径。 作者|皮爷 出品|产业家 成本、性价…

DS进阶:并查集

一、并查集的原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这…

Taro +vue3 中实现全局颜色css变量的设置和使用

当我们现在需要弄一个随时修改的页面颜色主题色 我们可以随时修改 我使用的是 Taro 框架 一般有一个app.less 文件 我们在这个里面 设置一个root 全局样式 :root {--primary-color: #028fd4;--secondary-color: #028fd6;/* 添加其他颜色变量 */ } 这样在全局我们就可以使用这…

uniapp 微信小程序 分享海报的实现

主页面 <template><view class"page"><!-- 自定义导航栏--><Navbar title"我的海报"></Navbar><view class"container"><poster ref"poster" :imageUrl"image" :imageWidth"7…

python之List列表

1. 高级数据类型 Python中的数据类型可以分为&#xff1a;数字型&#xff08;基本数据类型&#xff09;和非数字型&#xff08;高级数据类型&#xff09; 数字型包含&#xff1a;整型int、浮点型float、布尔型bool、复数型complex 非数字型包含&#xff1a;字符串str、列表l…