【STM32F407+CUBEMX+FreeRTOS+lwIP netconn UDP TCP记录】

STM32F407+CUBEMX+FreeRTOS+lwIP netconn UDP TCP记录

  • 注意
  • UDP
    • UDP1
    • UDP2
  • TCP
    • TCP client
    • TCP server
    • 图片

注意

1、超时
#include “lwipopts.h”

#define LWIP_SO_RCVTIMEO                1

2、先保证能ping通

3、关于工程创建可参考
【STM32F407+CUBEMX+FreeRTOS+lwIP之UDP记录】
4、其他可参考正点原子和野火的资料

UDP

UDP1

osThreadId_t netconn_udp_TaskHandle;
const osThreadAttr_t netconn_udp_Task_attributes = {.name = "udp_Task",.stack_size = 128 * 10,.priority = (osPriority_t) (osPriorityNormal-1),
};
void Start_netconn_udp_Task(void *argument);
void StartDefaultTask(void *argument)
{/* init code for LWIP */MX_LWIP_Init();/* USER CODE BEGIN StartDefaultTask */taskENTER_CRITICAL();           /* 进入临界区 */netconn_udp_TaskHandle = osThreadNew(Start_netconn_udp_Task, NULL, &netconn_udp_Task_attributes);
//	netconn_udp_server_TaskHandle = osThreadNew(Start_netconn_udp_server_Task, 
//							NULL, &netconn_udp_server_Task_attributes);
//	netconn_tcp_client_TaskHandle = osThreadNew(Start_netconn_tcp_client_Task, 
//							NULL, &netconn_tcp_client_Task_attributes);
//	netconn_tcp_server_TaskHandle = osThreadNew(Start_netconn_tcp_server_Task, 
//						NULL, &netconn_tcp_server_Task_attributes);taskEXIT_CRITICAL();            /* 退出临界区 *//* Infinite loop */for(;;){osDelay(1);}/* USER CODE END StartDefaultTask */
}
void Start_netconn_udp_Task(void *argument){vTaskDelay(1000);vTaskDelay(1000);vTaskDelay(1000);#define DEST_IP_ADDR0 192#define DEST_IP_ADDR1 168#define DEST_IP_ADDR2 123#define DEST_IP_ADDR3 92#define LWIP_DEMO_RX_BUFSIZE         2000        /* 定义最大接收数据长度 */#define LWIP_DEMO_PORT               8083       /* 定义连接的本地端口号 *//* 接收数据缓冲区 */uint8_t g_lwip_demo_recvbuf[LWIP_DEMO_RX_BUFSIZE];/* 发送数据内容 */char *g_lwip_demo_sendbuf = "ALIENTEK DATA\r\n";err_t err;static struct netconn *udpconn;static struct netbuf  *sentbuf,*recvbuf;ip_addr_t destipaddr;uint32_t data_len = 0;struct pbuf *q;static ip_addr_t *addr;static unsigned short port;/* 第一步:创建udp控制块 */udpconn = netconn_new(NETCONN_UDP);if(udpconn != NULL){/* 第二步:绑定控制块、本地IP和端口 */err = netconn_bind(udpconn, IP_ADDR_ANY, LWIP_DEMO_PORT);/*构造目的IP地址 */IP4_ADDR(&destipaddr, DEST_IP_ADDR0,DEST_IP_ADDR1,DEST_IP_ADDR2,DEST_IP_ADDR3);/* 第三步:连接或者建立对话框 */netconn_connect(udpconn, &destipaddr, LWIP_DEMO_PORT);  /* 连接到远端主机 */if(err == ERR_OK){while(1){/* 第四步:发送信息 */sentbuf = netbuf_new();netbuf_alloc(sentbuf, strlen((char *)g_lwip_demo_sendbuf));memcpy(sentbuf->p->payload, (void *)g_lwip_demo_sendbuf, strlen((char *)g_lwip_demo_sendbuf));err = netconn_send(udpconn, sentbuf);               /* 将netbuf中的数据发送出去 */if (err != ERR_OK){printf("发送失败\r\n");netbuf_delete(sentbuf);                         /* 删除buf */}netbuf_delete(sentbuf);                             /* 删除buf *//* 第五步:接收数据 */netconn_recv(udpconn, &recvbuf);if(recvbuf != NULL){								/* 接收到数据 */addr = netbuf_fromaddr(recvbuf);port = netbuf_fromport(recvbuf);memset(g_lwip_demo_recvbuf, 0, LWIP_DEMO_RX_BUFSIZE); /* 数据接收缓冲区清零 */for (q = recvbuf->p; q != NULL; q = q->next)        /* 遍历完整个pbuf链表 */{/* 判断要拷贝到UDP_DEMO_RX_BUFSIZE中的数据是否大于UDP_DEMO_RX_BUFSIZE的剩余空间,如果大于 *//* 的话就只拷贝UDP_DEMO_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据 */if (q->len > (LWIP_DEMO_RX_BUFSIZE - data_len)) memcpy(g_lwip_demo_recvbuf + data_len, q->payload, (LWIP_DEMO_RX_BUFSIZE - data_len)); /* 拷贝数据 */else memcpy(g_lwip_demo_recvbuf + data_len, q->payload, q->len);data_len += q->len;if (data_len > LWIP_DEMO_RX_BUFSIZE) break;     /* 超出TCP客户端接收数组,跳出 */}data_len = 0;printf("%s,%d,%s\n",inet_ntoa(addr),port,g_lwip_demo_recvbuf);netbuf_delete(recvbuf);                             /* 删除buf */}vTaskDelay(10);}}}
}

UDP2

osThreadId_t netconn_udp_server_TaskHandle;
const osThreadAttr_t netconn_udp_server_Task_attributes = {.name = "udp_server_Task",.stack_size = 128 * 10,.priority = (osPriority_t) (osPriorityNormal-1),
};
void Start_netconn_udp_server_Task(void *argument);
void StartDefaultTask(void *argument)
{/* init code for LWIP */MX_LWIP_Init();/* USER CODE BEGIN StartDefaultTask */taskENTER_CRITICAL();           /* 进入临界区 */
//	netconn_udp_TaskHandle = osThreadNew(Start_netconn_udp_Task, 
//							NULL, &netconn_udp_Task_attributes);netconn_udp_server_TaskHandle = osThreadNew(Start_netconn_udp_server_Task, NULL, &netconn_udp_server_Task_attributes);
//	netconn_tcp_client_TaskHandle = osThreadNew(Start_netconn_tcp_client_Task, 
//							NULL, &netconn_tcp_client_Task_attributes);
//	netconn_tcp_server_TaskHandle = osThreadNew(Start_netconn_tcp_server_Task, 
//						NULL, &netconn_tcp_server_Task_attributes);taskEXIT_CRITICAL();            /* 退出临界区 *//* Infinite loop */for(;;){osDelay(1);}/* USER CODE END StartDefaultTask */
}
void Start_netconn_udp_server_Task(void *argument){vTaskDelay(1000);vTaskDelay(1000);vTaskDelay(1000);static struct netconn *conn;static struct netbuf *buf;static ip_addr_t *addr;static unsigned short port;err_t err, recv_err;conn = netconn_new(NETCONN_UDP);if (conn!= NULL){err = netconn_bind(conn, IP_ADDR_ANY, 8081);if (err == ERR_OK){while (1) {recv_err = netconn_recv(conn, &buf);if (recv_err == ERR_OK) {addr = netbuf_fromaddr(buf);port = netbuf_fromport(buf);netconn_connect(conn, addr, port);buf->addr.addr = 0;netconn_send(conn,buf);netbuf_delete(buf);}vTaskDelay(10);}}else{netconn_delete(conn);}}
}

TCP

TCP client

osThreadId_t netconn_tcp_client_TaskHandle;
const osThreadAttr_t netconn_tcp_client_Task_attributes = {.name = "tcp_client_Task",.stack_size = 128 * 24,.priority = (osPriority_t) (osPriorityNormal-1),
};
void Start_netconn_tcp_client_Task(void *argument);
void StartDefaultTask(void *argument)
{/* init code for LWIP */MX_LWIP_Init();/* USER CODE BEGIN StartDefaultTask */taskENTER_CRITICAL();           /* 进入临界区 */
//	netconn_udp_TaskHandle = osThreadNew(Start_netconn_udp_Task, 
//							NULL, &netconn_udp_Task_attributes);
//	netconn_udp_server_TaskHandle = osThreadNew(Start_netconn_udp_server_Task, 
//							NULL, &netconn_udp_server_Task_attributes);netconn_tcp_client_TaskHandle = osThreadNew(Start_netconn_tcp_client_Task, NULL, &netconn_tcp_client_Task_attributes);
//	netconn_tcp_server_TaskHandle = osThreadNew(Start_netconn_tcp_server_Task, 
//						NULL, &netconn_tcp_server_Task_attributes);taskEXIT_CRITICAL();            /* 退出临界区 *//* Infinite loop */for(;;){osDelay(1);}/* USER CODE END StartDefaultTask */
}
void Start_netconn_tcp_client_Task(void *argument){vTaskDelay(1000);vTaskDelay(1000);vTaskDelay(1000);/* 接收数据缓冲区 */uint8_t g_lwip_demo_recvbuf[LWIP_DEMO_RX_BUFSIZE]; /* 发送数据内容 */char *g_lwip_demo_sendbuf = "ALIENTEK DATA\r\n";static struct netconn *tcp_clientconn = NULL; /* TCP CLIENT网络连接结构体 */err_t err,recv_err;ip4_addr_t server_ipaddr,loca_ipaddr;static uint16_t server_port,loca_port;struct pbuf *q;uint32_t data_len = 0;server_port = LWIP_DEMO_PORT;IP4_ADDR(&server_ipaddr,DEST_IP_ADDR0,DEST_IP_ADDR1,DEST_IP_ADDR2,DEST_IP_ADDR3);   /* 构造目的IP地址 */while(1){;tcp_clientconn = netconn_new(NETCONN_TCP);                                      /* 创建一个TCP链接 *//*在网之后再开服务端*/err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port);               /* 连接服务器 */if (err != ERR_OK){printf("接连失败\r\n");netconn_delete(tcp_clientconn);                                             /* 返回值不等于ERR_OK,删除tcp_clientconn连接 */}else if (err == ERR_OK)                                                         /* 处理新连接的数据 */{struct netbuf *recvbuf;tcp_clientconn->recv_timeout = 10;netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1);                  /* 获取本地IP主机IP地址和端口号 */printf("连接上服务器%d.%d.%d.%d,本机端口号为:%d\r\n",DEST_IP_ADDR0,DEST_IP_ADDR1, DEST_IP_ADDR2,DEST_IP_ADDR3,loca_port);while(1){err = netconn_write(tcp_clientconn ,g_lwip_demo_sendbuf,strlen((char*)g_lwip_demo_sendbuf),NETCONN_COPY); /* 发送tcp_server_sentbuf中的数据 */if (err != ERR_OK){printf("发送失败\r\n");}recv_err = netconn_recv(tcp_clientconn,&recvbuf);if (recv_err == ERR_OK)            /* 接收到数据 */{taskENTER_CRITICAL();                                                    /* 进入临界区 */memset(g_lwip_demo_recvbuf,0,LWIP_DEMO_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 > (LWIP_DEMO_RX_BUFSIZE - data_len)) {memcpy(g_lwip_demo_recvbuf + data_len,q->payload,(LWIP_DEMO_RX_BUFSIZE - data_len));/* 拷贝数据 */}else {memcpy(g_lwip_demo_recvbuf + data_len,q->payload,q->len);}data_len += q->len;if (data_len > LWIP_DEMO_RX_BUFSIZE) {break;                  /* 超出TCP客户端接收数组,跳出 */}}taskEXIT_CRITICAL();            /* 退出临界区 */data_len = 0;                   /* 复制完成后data_len要清零 */printf("%s\n",g_lwip_demo_recvbuf);}else if (recv_err == ERR_CLSD)       /* 关闭连接 */{netconn_close(tcp_clientconn);netconn_delete(tcp_clientconn);printf("服务器%d.%d.%d.%d断开连接\r\n",DEST_IP_ADDR0,DEST_IP_ADDR1, DEST_IP_ADDR2,DEST_IP_ADDR3);break;}vTaskDelay(10);}}vTaskDelay(10);}
}

TCP server

osThreadId_t netconn_tcp_server_TaskHandle;
const osThreadAttr_t netconn_tcp_server_Task_attributes = {.name = "tcp_server_Task",.stack_size = 128 * 24,.priority = (osPriority_t) (osPriorityNormal-1),
};
void Start_netconn_tcp_server_Task(void *argument);
void StartDefaultTask(void *argument)
{/* init code for LWIP */MX_LWIP_Init();/* USER CODE BEGIN StartDefaultTask */taskENTER_CRITICAL();           /* 进入临界区 */
//	netconn_udp_TaskHandle = osThreadNew(Start_netconn_udp_Task, 
//							NULL, &netconn_udp_Task_attributes);
//	netconn_udp_server_TaskHandle = osThreadNew(Start_netconn_udp_server_Task, 
//							NULL, &netconn_udp_server_Task_attributes);
//	netconn_tcp_client_TaskHandle = osThreadNew(Start_netconn_tcp_client_Task, 
//							NULL, &netconn_tcp_client_Task_attributes);netconn_tcp_server_TaskHandle = osThreadNew(Start_netconn_tcp_server_Task, NULL, &netconn_tcp_server_Task_attributes);taskEXIT_CRITICAL();            /* 退出临界区 *//* Infinite loop */for(;;){osDelay(1);}/* USER CODE END StartDefaultTask */
}
void Start_netconn_tcp_server_Task(void *argument){vTaskDelay(1000);vTaskDelay(1000);vTaskDelay(1000);static struct netconn *tcp_serverconn = NULL; /* TCP SERVER网络连接结构体 */err_t     err,recv_err;struct netconn *newconn;static    ip_addr_t ipaddr;static    u16_t  port;uint8_t   remot_addr[4];uint32_t  data_len = 0;struct    pbuf *q;/* 接收数据缓冲区 */uint8_t g_lwip_demo_recvbuf[LWIP_DEMO_RX_BUFSIZE]; /* 发送数据内容 */char *g_lwip_demo_sendbuf = "ALIENTEK DATA \r\n";/* 第一步:创建一个TCP控制块 */tcp_serverconn = netconn_new(NETCONN_TCP);                      /* 创建一个TCP链接 *//* 第二步:绑定TCP控制块、本地IP地址和端口号 */netconn_bind(tcp_serverconn,IP_ADDR_ANY,LWIP_DEMO_PORT);        /* 绑定端口 8083号端口 *//* 第三步:监听 */netconn_listen(tcp_serverconn);                                 /* 进入监听模式 */tcp_serverconn->recv_timeout = 10;                              /* 禁止阻塞线程 等待10ms */
tcp_star:while (1) {/* 第四步:接收连接请求 */err = netconn_accept(tcp_serverconn,&newconn);              /* 接收连接请求 */if (err == ERR_OK){ newconn->recv_timeout = 10;}if (err == ERR_OK)                                          /* 处理新连接的数据 */{ struct netbuf *recvbuf;netconn_getaddr(newconn,&ipaddr,&port,0);               /* 获取远端IP地址和端口号 */remot_addr[3] = (uint8_t)(ipaddr.addr >> 24); remot_addr[2] = (uint8_t)(ipaddr.addr>> 16);remot_addr[1] = (uint8_t)(ipaddr.addr >> 8);remot_addr[0] = (uint8_t)(ipaddr.addr);printf("主机%d.%d.%d.%d连接上服务器,主机端口号为:%d\r\n",remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3],port);while (1){err = netconn_write(newconn ,g_lwip_demo_sendbuf,strlen((char*)g_lwip_demo_sendbuf),NETCONN_COPY); /* 发送g_lwip_demo_sendbuf中的数据 */if(err != ERR_OK){printf("发送失败\r\n");}recv_err = netconn_recv(newconn,&recvbuf);if (recv_err == ERR_OK)           /* 接收到数据 */{ taskENTER_CRITICAL();                                           /* 进入临界区 */memset(g_lwip_demo_recvbuf,0,LWIP_DEMO_RX_BUFSIZE);               /* 数据接收缓冲区清零 */for (q = recvbuf->p;q != NULL;q = q->next)                       /* 遍历完整个pbuf链表 */{/* 判断要拷贝到LWIP_DEMO_RX_BUFSIZE中的数据是否大于LWIP_DEMO_RX_BUFSIZE的剩余空间,如果大于 *//* 的话就只拷贝LWIP_DEMO_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据 */if(q->len > (LWIP_DEMO_RX_BUFSIZE-data_len)){memcpy(g_lwip_demo_recvbuf + data_len,q->payload,(LWIP_DEMO_RX_BUFSIZE - data_len));/* 拷贝数据 */}else{memcpy(g_lwip_demo_recvbuf + data_len,q->payload,q->len);}data_len += q->len;if(data_len > LWIP_DEMO_RX_BUFSIZE){break;   /*超出TCP客户端接收数组,跳出*/}}taskEXIT_CRITICAL();                                /* 退出临界区 */data_len = 0;                                       /* 复制完成后data_len要清零 */printf("%s\n",g_lwip_demo_recvbuf);					netbuf_delete(recvbuf);}else if (recv_err == ERR_CLSD)                           /* 关闭连接 */{netconn_close(newconn);netconn_delete(newconn);printf("主机:%d.%d.%d.%d断开与服务器的连接\r\n",remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3]);
//					break;goto tcp_star;}vTaskDelay(10);}}vTaskDelay(10);}/*ST*/
//	 struct netconn *conn, *newconn;
//  err_t err, accept_err;
//  struct netbuf *buf;
//  void *data;
//  u16_t len;//  /* Create a new connection identifier. */
//  conn = netconn_new(NETCONN_TCP);
//  
//  if (conn!=NULL)
//  {  
//    /* Bind connection to well known port number 7. */
//    err = netconn_bind(conn, NULL, 7);
//    
//    if (err == ERR_OK)
//    {
//      /* Tell connection to go into listening mode. */
//      netconn_listen(conn);
//    
//      while (1) 
//      {
//        /* Grab new connection. */
//         accept_err = netconn_accept(conn, &newconn);
//    
//        /* Process the new connection. */
//        if (accept_err == ERR_OK) 
//        {//          while (netconn_recv(newconn, &buf) == ERR_OK) 
//          {
//            do 
//            {
//              netbuf_data(buf, &data, &len);
//				printf("%s\n",data);
//              netconn_write(newconn, data, len, NETCONN_COPY);
//          
//            } 
//            while (netbuf_next(buf) >= 0);
//          
//            netbuf_delete(buf);
//          }
//        
//          /* Close connection and discard connection identifier. */
//          netconn_close(newconn);
//          netconn_delete(newconn);
//        }
//      }
//    }
//    else
//    {
//      netconn_delete(newconn);
//    }
//  }}

图片

在这里插入图片描述

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

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

相关文章

C语言之数据结构之栈和队列的运用

目录 1. 用队列实现栈1.1 思路讲解1.2 代码实现 2. 用栈实现队列1.1 思路讲解1.2 代码实现 总结 •͈ᴗ•͈ 个人主页:御翮 •͈ᴗ•͈ 个人专栏:C语言数据结构 •͈ᴗ•͈ 欢迎大家关注和订阅!!! 1. 用队列实现栈 题目描述: 请你仅使用两个…

恶补《操作系统》5_2——王道学习笔记

5.2_1 I-O核心子系统 1、用户层软件 假脱机系统 2、设备独立性软件(设备无关性软件) IO调度、设备保护、设备分配与回收、缓冲区管理 3、设备驱动程序(比如打印机驱动) 4、中断处理程序 5、硬件 5.2_2 假脱机技术&#xff…

小程序引入 Vant Weapp 极简教程

一切以 Vant Weapp 官方文档 为准 Vant Weapp 官方文档 - 快速入手 1. 安装nodejs 前往官网下载安装即可 nodejs官网 安装好后 在命令行(winr,输入cmd)输入 node -v若显示版本信息,即为安装成功 2. 在 小程序根目录 命令行/终端…

www.fastssh.com SSH over WebSockets with CDNs

https://www.fastssh.com/page/create-ssh-cdn-websocket/server/这其实不是标准的websocket报文(服务器响应报文无Sec-Websocket-Accept字段),所以无法使用github.com/gorilla/websocket包:GET / HTTP/1.1 Host: hostname:8080 User-Agent: Go-http-cli…

jvm重要参数可视化和线上问题排查

jvm重要参数可视化和线上问题排查 目标jvm参数分类(了解)运行时数据区相关的(jdk1.8)处理 OOM 相关的垃圾回收器相关的GC 日志记录相关的意义,默认值,调优原则(重要, 待拆分) 排查 OOM 流程 和 常见原因参考文章 目标 …

【除了协程还有哪些方式可以实现异步编程】

在Unity中,除了使用协程实现异步编程外,还有以下几种方法: 异步加载资源: 使用UnityWebRequest类进行异步加载资源,这在加载网络资源或动态加载资源时非常有用。 using UnityEngine; using UnityEngine.Networking;…

基于OpenCv的图像特征点检测

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

C语言/数据结构——(用双链表实现数据的增删查改)

一.前言 嗨嗨嗨,大家好久不见!前面我们已经通过数组实现数据的增删查改、单链表实现数据的增删查改,现在让我们尝试一下使用双链表实现数据的增删查改吧! 二.正文 如同往常一样,对于稍微大点的项目来说,…

【工程记录】Python爬虫入门记录(Requests BeautifulSoup)

目录 写在前面1. 环境配置2. 获取网页数据3. 解析网页数据4. 提取所需数据4.1 简单提取4.2 多级索引提取 5. 常见问题 写在前面 仅作个人学习与记录用。主要整理使用Requests和BeautifulSoup库的简单爬虫方法。在进行数据爬取时,请确保遵守相关法律法规和网站的服务…

FLIR LEPTON3.5 热像仪wifi 科研实验测温采集仪

点击查看详情!点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情 1、描述 这是一款桌面科研实验测温热成像多功能热像记录仪,小巧轻便…

SFOS1:开发环境搭建

一、简介 最近在学习sailfish os的应用开发,主要内容是QmlPython。所以,在开发之前需要对开发环境(virtualBox官方SDKcmake编译器python)进行搭建。值得注意的是,我的开发环境是ubuntu22.04。如果是windows可能大同小异…

带文字海报流程自动化

上一篇文章: 带文字海报流程自动化 - 知乎 项目代码整理在: https://github.com/liangwq/Chatglm_lora_multi-gpu​github.com/liangwq/Chatglm_lora_multi-gpu 根据用户的输入生成图片prompt模块代码封装: from openai import OpenAI im…

获取淘宝商品销量数据接口

淘宝爬虫商品销量数据采集通常涉及以下几个步骤: 1、确定采集目标:需要明确要采集的商品类别、筛选条件(如天猫、价格区间)、销量和金额等数据。例如,如果您想了解“小鱼零食”的销量和金额,您需要设定好价…

【云原生系列】云计算概念与架构设计介绍

1 什么是云计算 云计算是一种基于互联网的计算模式,在这个模式下,各种计算资源(例如计算机、存储设备、网络设备、应用程序等)可以通过互联网实现共享和交付。云计算架构设计的主要目标是实现高效、可扩展、可靠、安全和经济的计算…

C++多态特性详解

目录 概念: 定义及实现: 虚函数重写的两个例外: 1.协变: 2.析构函数的重写: final关键字: override关键字: 多态是如何实现的(底层): 面试题&#xff1…

idea No versioned directories to update were found

idea如何配置svn以及svn安装时需要注意什么 下载地址:https://112-28-188-82.pd1.123pan.cn:30443/download-cdn.123pan.cn/batch-download/123-820/3ec9445a/1626635-0/3ec9445a25ba365a23fc433ce0c16f34?v5&t1714358478&s171435847804276f7d9249382ba512…

代码随想录算法训练营DAY40\DAY41|C++动态规划Part.3|343.整数拆分、96.不同的二叉搜索树

DAY40休息日,本篇为DAY41的内容 文章目录 343.整数拆分思路dp含义递推公式(难点)初始化遍历顺序打印 CPP代码数学方法归纳证明法 96.不同的二叉搜索树思路dp含义递推公式初始化遍历顺序打印 CPP代码题目总结 343.整数拆分 力扣题目链接 文章…

小蓝本--因式分解(习题1)讲解

这几天要备战期中,下一期可能要等暑假了...... 小升初的压力真是紧扣于头啊,为了分到一个好班,拼了! 对了,下一期可能在寒假更,见谅! 1分解因式: 公因式: 答案&#xff…

vue3--element-plus-抽屉文件上传和富文本编辑器

一、封装组件 article/components/ArticleEdit.vue <script setup> import { ref } from vue const visibleDrawer ref(false)const open (row) > {visibleDrawer.value trueconsole.log(row) }defineExpose({open }) </script><template><!-- 抽…

iptables---防火墙

防火墙介绍 防火墙的作用可以理解为是一堵墙&#xff0c;是一个门&#xff0c;用于保护服务器安全的。 防火墙可以保护服务器的安全&#xff0c;还可以定义各种流量匹配的规则。 防火墙的作用 防火墙具有对服务器很好的保护作用&#xff0c;入侵者必须穿透防火墙的安全防护…