当前位置: 首页 > news >正文

UIP协议栈 TCP Server Client通信成功案例

文章目录

  • 这里边有相当好的 [UIP 文档资料,文档位置在仓库的UIP/uip doc ,括号内是仓库地址(https://gitee.com/free-people-in-time-and-space/net-work-learn-note.git )
  • TCP Server
    • 1.main循环里做的事
    • 2.以下是main循环里相关函数的实现
    • 3.还有个很重要的就是UIP用户使用的用户程序 UIP_APPCALL,进行处理收发数据的
    • 4.下边是ethernet mac 数据收发和UIP的连接处

UIP协议栈是属于极简版本的TCP/IP协议栈,比LWIP协议栈还精简,本文章只提供关键部分的参考历程还有很多东西,需要你自己去看文章去学习的,不过有个前提你得懂TCP/IP协议栈和计算机网络知识,比如学过LWIP啥的,要不然你看不懂的

这里边有相当好的 [UIP 文档资料,文档位置在仓库的UIP/uip doc ,括号内是仓库地址(https://gitee.com/free-people-in-time-and-space/net-work-learn-note.git )

TCP Server

1.main循环里做的事

        uip_polling(); // 处理uip事件,必须插入到用户程序的循环体中eth0_receive();sprintf(eth_txbuf, "HHH send data value WLS:%d ", i++);eth0_send(eth_txbuf);memset(eth_txbuf, 0, 64);i %= 127;

2.以下是main循环里相关函数的实现

/*** @file uip_app.c* @author Ge (ufo281@outlook.com)* * @brief uip app example(For TCP Server)* * @version 0.1* @date 2024-10-09* * @copyright Copyright (c) 2024* */
#include "uip_app.h"/*对比服务端的状态*/
unsigned char tcp_server_test_staus = 0XFF; /*** @brief form uip rx data* */
void eth0_receive()
{/*客户端收到数据,并在这里处理一些数据*/if (tcp_server_test_staus != tcp_server_state) // TCP Client状态改变{if (tcp_server_state & (1 << 6)) // 收到新数据{/*在tcp_server_demo_appcall函数中 用strcpy()函数从uip_appdata复制过来的*/// uip_log("[eth0_receive]: TCP Clinet data:");UART1_Send_String("[eth0_receive TCP]:");UART1_Send_String(tcp_server_databuf);UART1_Send_String("\r\n");tcp_server_state &= ~(1 << 6); // 标记数据已经被处理}tcp_server_test_staus = tcp_server_state;}// printf("uip_timer: %d",uip_timer);
}/*** @brief tx data to uip* * @param eth0_string data*/
void eth0_send(unsigned char *eth0_string)
{if (tcp_server_state & (1 << 7)) // 连接还存在{sprintf((char *)tcp_server_databuf, eth0_string);// 标记有数据需要发送tcp_server_state |= 1 << 5;}else{// UART1_Send_String("[eth0_send]:TCP Server NOT Coneceted!! \r\n");}}/*** @brief uip事件处理函数* 必须将该函数插入用户主循环,循环调用.*/
void uip_polling(void)
{unsigned char i;static struct timer periodic_timer, arp_timer;static unsigned char timer_ok = 0;if (timer_ok == 0) // 仅初始化一次{timer_ok = 1;timer_set(&periodic_timer, CLOCK_SECOND / 2); // 创建1个0.5秒的定时器timer_set(&arp_timer, CLOCK_SECOND * 10);     // 创建1个10秒的定时器}uip_len = tapdev_read(); // 从网络设备读取一个IP包,得到数据长度.uip_len在uip.c中定义if (uip_len > 0)         // 有数据{// 处理IP数据包(只有校验通过的IP包才会被接收)if (BUF->type == htons(UIP_ETHTYPE_IP)) // 是否是IP包?{uip_arp_ipin(); // 去除以太网头结构,更新ARP表uip_input();    // IP包处理// 当上面的函数执行后,如果需要发送数据,则全局变量 uip_len > 0// 需要发送的数据在uip_buf, 长度是uip_len  (这是2个全局变量)if (uip_len > 0) // 需要回应数据{uip_arp_out(); // 加以太网头结构,在主动连接时可能要构造ARP请求tapdev_send(); // 发送数据到以太网}}else if (BUF->type == htons(UIP_ETHTYPE_ARP)) // 处理arp报文,是否是ARP请求包?{uip_arp_arpin();// 当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0// 需要发送的数据在uip_buf, 长度是uip_len(这是2个全局变量)if (uip_len > 0)tapdev_send(); // 需要发送数据,则通过tapdev_send发送}}else if (timer_expired(&periodic_timer)) // 0.5秒定时器超时{timer_reset(&periodic_timer); // 复位0.5秒定时器// 轮流处理每个TCP连接, UIP_CONNS缺省是40个for (i = 0; i < UIP_CONNS; i++){uip_periodic(i); // 处理TCP通信事件// 当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0// 需要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量)if (uip_len > 0){uip_arp_out(); // 加以太网头结构,在主动连接时可能要构造ARP请求tapdev_send(); // 发送数据到以太网}}
#if UIP_UDP // UIP_UDP// 轮流处理每个UDP连接, UIP_UDP_CONNS缺省是10个for (i = 0; i < UIP_UDP_CONNS; i++){uip_udp_periodic(i); // 处理UDP通信事件// 当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0// 需要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量)if (uip_len > 0){uip_arp_out(); // 加以太网头结构,在主动连接时可能要构造ARP请求tapdev_send(); // 发送数据到以太网}}
#endif// 每隔10秒调用1次ARP定时器函数 用于定期ARP处理,ARP表10秒更新一次,旧的条目会被抛弃if (timer_expired(&arp_timer)){timer_reset(&arp_timer);uip_arp_timer();}}
}/****************************************************IAP接收到程序后写入Flash************************************************************//*** @brief uip config*      set ip netmask router's IP address. mac addr and config ethernet mac**/
void uip_config(void)
{uip_ipaddr_t ipaddr, remote_ip;while (tapdev_init()) {UART1_Send_String("MX6800 Ehthernet MAC Init Error! \r\n");mdelay(200);}// uIP初始化uip_init();/* ARP table initialize. */uip_arp_init();// 设置本地设置IP地址uip_ipaddr(ipaddr, 192, 168, 1, 137);uip_sethostaddr(ipaddr);// 设置网关IP地址(其实就是你路由器的IP地址)uip_ipaddr(ipaddr, 192, 168, 1, 1);uip_setdraddr(ipaddr);// 设置网络掩码uip_ipaddr(ipaddr, 255, 255, 255, 0);uip_setnetmask(ipaddr);// 设置 远程客户端IP为192.168.1.100uip_ipaddr(&remote_ip, 192, 168, 1, 100); uip_connect(&remote_ip, htons(7090)); /*连接到远程客户端的通信端口为7090 *//* We start to listen for connections on TCP port 8090. */uip_listen(HTONS(8090));}

3.还有个很重要的就是UIP用户使用的用户程序 UIP_APPCALL,进行处理收发数据的

/*** @file tcp_demo.c* @author GeShuHan (ufo281@outlook.com)* * @brief Processing of UIP protocol stack TX&&RX data* * @version 0.1* @date 2024-10-09* * @copyright Copyright (c) 2024* */
#include "uip.h"
#include "tcp_demo.h"
#include "obc_uart.h"unsigned char tcp_server_databuf[1500]; // 发送数据缓存/*** @brief 服务端状态*  bit0:*  bit1:*  bit2:*  bit3:*  bit4:*  bit5: 0:无数据发送,有数据要发送*  bit6: 0:未收到数据,1:收到客户端的数据*  bit7: 0:无连接,1:连接成功*/
unsigned char tcp_server_state;/*** @brief 这是一个TCP 服务器应用回调函数。*  该函数通过UIP_APPCALL(tcp_demo_appcall)调用,实现Web Server的功能.* 当uip事件发生时,UIP_APPCALL函数会被调用,根据所属端口(1200),确定是否执行该函数。* 例如 : 当一个TCP连接被创建时、有新的数据到达、数据已经被应答、数据需要重发等事件*/
void tcp_server_demo_appcall(void)
{struct tcp_demo_appstate *s = (struct tcp_demo_appstate *)&uip_conn->appstate;// 连接终止if (uip_aborted()) {tcp_server_state &= ~(1 << 7);      // 标志没有连接uip_log("TCP_Server Aborted!\r\n"); // 打印log}// 连接超时if (uip_timedout()) {tcp_server_state &= ~(1 << 7);      // 标志没有连接uip_log("TCP_Server Timeout!\r\n"); // 打印log}// 连接关闭if (uip_closed()) {tcp_server_state &= ~(1 << 7);     // 标志没有连接uip_log("TCP_server CLOSED!\r\n"); // 打印log}// 连接成功if (uip_connected()) {struct tcp_demo_appstate *s = (struct tcp_demo_appstate *)&uip_conn->appstate;// uip_conn结构体有一个"appstate"字段指向应用程序自定义的结构体。// 声明一个s指针,是为了便于使用。// 不需要再单独为每个uip_conn分配内存,这个已经在uip中分配好了。// 在uip.c 中 的相关代码如下://		struct uip_conn *uip_conn;//		struct uip_conn uip_conns[UIP_CONNS]; //UIP_CONNS缺省=10// 定义了1个连接的数组,支持同时创建几个连接。// uip_conn是一个全局的指针,指向当前的tcp或udp连接。tcp_server_state |= 1 << 7;           // 标志连接成功uip_log("TCP_Server Connected OK!\r\n"); // 打印logs->state = STATE_CMD;                 // 指令状态s->textlen = 0;s->textptr = "WLS TCP_client Connected Successfully!\r\n"; // 回应消息// s->textptr = "Connect to ALIENTEK STM32 Board Successfully!\r\n";s->textlen = strlen((char *)s->textptr);}// 发送的数据成功送达if (uip_acked()) {struct tcp_demo_appstate *s = (struct tcp_demo_appstate *)&uip_conn->appstate;// 发送清零s->textlen = 0; }else{/*数据发送失败*/uip_log("TCP_Server NOT ACK!\r\n"); }/* 接收到一个新的TCP数据包,收到客户端发过来的数据*/if (uip_newdata()){// 还未收到数据if ((tcp_server_state & (1 << 6)) == 0){// if (uip_len > 199)// {//     ((unsigned char *)uip_appdata)[199] = 0;// }memset(tcp_server_databuf, 0, 1500);strcpy((char *)tcp_server_databuf, uip_appdata);// 表示收到客户端数据tcp_server_state |= 1 << 6; }}else if (tcp_server_state & (1 << 5)) // 有数据需要发送{s->textptr = tcp_server_databuf;s->textlen = strlen((const char *)tcp_server_databuf);memset(tcp_server_databuf, 0, 1500);tcp_server_state &= ~(1 << 5); // 清除标记}// 当需要重发、新数据到达、数据包送达、连接建立时,通知uip发送数据if (uip_rexmit() || uip_newdata() || uip_acked() || uip_connected() || uip_poll()){        struct tcp_demo_appstate *s = (struct tcp_demo_appstate *)&uip_conn->appstate;// s->textptr : 发送的数据包缓冲区指针// s->textlen :数据包的大小(单位字节)if (s->textlen > 0)uip_send(s->textptr, s->textlen); // 发送TCP数据包}
}/*** @brief TCP应用接口函数(UIP_APPCALL)*  完成TCP服务(包括server和client)*/
void tcp_demo_appcall(void)
{switch (uip_conn->lport) // 本地监听端口80和1200{case HTONS(8090):tcp_server_demo_appcall();// uip_log("tcp_demo_appcall Local 8080 TCP Server!! \r\n");}#ifdef TCP_Client/*tcp client use */switch (uip_conn->rport) // 远程连接8080端口{case HTONS(8080): // 一旦有来自远程主机的信息,就调用此函数// tcp_client_demo_appcall();// uip_log("tcp_demo_appcall Remote 8080 TCP Client!! \r\n");break;}#endif}/*** @brief 打印日志用** @param m data*/
void uip_log(char *m)
{UART1_Send_String("[UIP_LOG]:");UART1_Send_String(m);
}

4.下边是ethernet mac 数据收发和UIP的连接处

/** Copyright (c) 2001, Swedish Institute of Computer Science.* All rights reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions* are met:** 1. Redistributions of source code must retain the above copyright*    notice, this list of conditions and the following disclaimer.** 2. Redistributions in binary form must reproduce the above copyright*    notice, this list of conditions and the following disclaimer in the*    documentation and/or other materials provided with the distribution.** 3. Neither the name of the Institute nor the names of its contributors*    may be used to endorse or promote products derived from this software*    without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE* ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF* SUCH DAMAGE.** Author: Adam Dunkels <adam@sics.se>** $Id: tapdev.c,v 1.8 2006/06/07 08:39:58 adam Exp $*/
#include "tapdev.h"
#include "uip.h"/*STM32 Ethernet MAC RX TX BUF*/
__attribute__((aligned(4))) char ob_eth_rx_buf[1518];
__attribute__((aligned(4))) char ob_eth_tx_buf[1518];/*MX6800 Ethernet Variable*/
struct eth_device *ob_ethernet_dev = NULL;/*** @brief config ethernet mac** @return unsigned char 0:OK*                       1:Failed!*/
unsigned char tapdev_init(void)
{unsigned char mac_addr[6] = {0xB8, 0xAE, 0x1D, 0x00, 0x01, 0x00};/*config UIP MAC ADDR*/for (unsigned char i = 0; i < 6; i++)uip_ethaddr.addr[i] = mac_addr[i];/*---------------------------Ethernet MAC + PHY chip Init-------------------------*/eth_init();ob_ethernet_dev = eth_get_dev();if (!eth_is_active(ob_ethernet_dev)){UART1_Send_String("[tapdev_init] eth gmac not initiated\r\n");return 1;}/*set Ethernet mac address*/if (eth_write_hwaddr(ob_ethernet_dev, mac_addr) == -1){UART1_Send_String("[tapdev_init] eth_write_hwaddr set mac addr ob_ethernet_dev failed! \r\n");}/*---------------------------Ethernet MAC + PHY chip Init-------------------------*/return 0;
}/*** @brief from STM32 Ethernet MAC read data** @return uint16_t data*/
uint16_t tapdev_read(void)
{int eth_rxlen = 0;eth_rxlen = eth_recv(ob_ethernet_dev, ob_eth_rx_buf); /* by runsheng */memcpy(uip_buf, ob_eth_rx_buf, eth_rxlen);memset(ob_eth_rx_buf, 0, 1518);return eth_rxlen;
}/*** @brief from STM32 Ethernet MAC send data**/
void tapdev_send(void)
{eth_send(ob_ethernet_dev, (void *)uip_buf, uip_len);
}

相关文章:

UIP协议栈 TCP Server Client通信成功案例

文章目录 这里边有相当好的 [UIP 文档资料&#xff0c;文档位置在仓库的UIP/uip doc &#xff0c;括号内是仓库地址&#xff08;https://gitee.com/free-people-in-time-and-space/net-work-learn-note.git &#xff09;TCP Server1.main循环里做的事2.以下是main循环里相关函数…...

Android Studio Koala Feature Drop 稳定版现已推出

作者 / Android Studio 产品经理 Sandhya Mohan Android Studio Koala Feature Drop (2024.1.2) 现已推出&#xff01;&#x1f428; &#x1f517; Android Studio https://developer.android.google.cn/studio 今年早些时候&#xff0c;我们宣布每个 Android Studio 动物版本…...

胤娲科技:AI评估新纪元——LightEval引领透明化与定制化浪潮

AI评估的迷雾&#xff0c;LightEval能否拨云见日&#xff1f; 想象一下&#xff0c;你是一位AI模型的开发者&#xff0c;精心打造了一个智能助手&#xff0c;却在最终评估阶段遭遇了意外的“滑铁卢”。 问题出在哪里&#xff1f;是模型本身不够聪明&#xff0c;还是评估标准太过…...

Python安装|PyCharm Professional 下载安装教程。2024最新版,亲测使用!

一、下载地址&#xff1a; 二、Python的下载及安装&#xff1a; 1、从上面网址进入Python官网 2、安装流程图&#xff1a; 双击已经下载好的python-*.*.*-amd64.exe文件&#xff0c;开始安装 最后就等它自己安装完成就好了 3、检验是否安装完成&#xff1a; windowsR快捷键…...

JavaSwitch控制流语句

在Java中&#xff0c;switch语句是一种控制流语句&#xff0c;用于根据变量的不同值执行不同的代码块。它提供了一种替代if-else语句的方式&#xff0c;使代码更简洁和易于阅读。以下是switch语句的基本语法和使用示例。 基本语法 switch (expression) {case value1:// 执行代码…...

PCL 3D-SIFT关键点检测(Z方向梯度约束

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 SIFT关键点检测 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#…...

肺结节分割与提取系统(基于传统图像处理方法)

Matlab肺结节分割(肺结节提取)源程序&#xff0c;GUI人机界面版本。使用传统图像分割方法&#xff0c;非深度学习方法。使用LIDC-IDRI数据集。 工作如下&#xff1a; 1、读取图像。读取原始dicom格式的CT图像&#xff0c;并显示&#xff0c;绘制灰度直方图&#xff1b; 2、图像…...

ESP32 COAP 客户端观察者模式下,GET服务器的例程

目录 环境准备 示例代码 代码解释 初始化: CoAP 上下文和会话: 注册响应处理函数: 创建和发送 GET 请求: 处理响应: 主循环: 注意事项 ESP32 是一款功能强大的微控制器,支持多种通信协议,包括 CoAP(Constrained Application Protocol)。CoAP 是一种专为物联…...

【Kubernetes】常见面试题汇总(五十七)

目录 125. K8S 创建服务 status 为 ErrlmagePull&#xff1f; 126.不能进入指定容器内部&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 …...

Java 设计模式 构建者模式

文章目录 1 概念2 使用方法1 创建步骤&#xff1a;2 使用步骤&#xff1a; 参考 1 概念 builder模式又叫建造者模式&#xff0c;属于创建型模式 作用&#xff1a;将一个复杂对象的构建与他的表示分离&#xff0c;可以一步一步构建对象&#xff0c;而不是使用构造函数构造一次…...

建设企业网站如何建

首先&#xff0c;企业网站是企业数字化转型的重要组成部分。在数字化浪潮的冲击下&#xff0c;企业需要通过建设网站来实现信息化管理&#xff0c;提高工作效率。通过企业网站&#xff0c;企业可以便捷地发布最新产品信息、公司新闻、招聘信息等&#xff0c;极大地提升了信息传…...

C++ inline 的更进一步理解

文章目录 1.概述2.ODR(One Definition Rule)问题3.范例测试代码4.好坏分析 ODR: One Definition Rule&#xff0c;即单一定义规则&#xff0c; C 语言中非常重要的一项规则&#xff0c;它确保程序的行为一致性并避免链接时出现冲突。ODR 的核心思想是在整个程序中&#xff0c;每…...

海康威视云台相机图像获取

直接上代码&#xff1a; import cv2# 替换为正确的RTSP链接 rtsp_url rtsp://admin:abcd12345192.168.1.64:554/h264/ch1/main/av_stream cap cv2.VideoCapture(rtsp_url)if not cap.isOpened():print("无法打开视频流&#xff0c;检查RTSP URL和凭证") else:whil…...

什么是词嵌入(Word Embedding)

1. 什么是词嵌入(Word Embedding) ⾃然语⾔是⼀套⽤来表达含义的复杂系统。在这套系统中&#xff0c;词是表义的基本单元。顾名思义&#xff0c;词向量是⽤来表⽰词的向量&#xff0c;也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌⼊&#xff08;word e…...

LSTM时间序列模型实战——预测上证指数走势

LSTM时间序列模型实战——预测上证指数走势 关于作者 作者&#xff1a;小白熊 作者简介&#xff1a;精通python、matlab、c#语言&#xff0c;擅长机器学习&#xff0c;深度学习&#xff0c;机器视觉&#xff0c;目标检测&#xff0c;图像分类&#xff0c;姿态识别&#xff0c;…...

基于 STM32F407 的 SPI Flash下载算法

目录 一、概述二、自制 FLM 文件1、修改使用的芯片2、修改输出算法的名称3、其它设置4、修改配置文件 FlashDev.c5、文件 FlashPrg.c 的实现 三、验证算法 一、概述 本文将介绍如何使用 MDK 创建 STM32F407 的 SPI Flash 下载算法。 其中&#xff0c;SPI Flash 芯片使用的是 W…...

力扣之1355.活动参与者

题目&#xff1a; Sql 测试用例&#xff1a; Create table If Not Exists Friends (id int, name varchar(30), activity varchar(30)); Create table If Not Exists Activities (id int, name varchar(30)); Truncate table Friends; insert into Friends (id, name, acti…...

数据资产治理:构建敏捷与安全的数据管理体系

在当今数字化的盛况下&#xff0c;作为核心资产的数据已经越发受到企业的重视。但是随着公司的逐步壮大&#xff0c;如何分析这些数据以及如何有效治理数据资产&#xff0c;以确保安全性、合规性以及易用性&#xff0c;是企业面临的重大挑战。数聚股份将从多年从业经验深度探讨…...

Nodejs连接Mysql笔记

框架搭建 安装Node.js 首先&#xff0c;确保你已经在系统上安装了Node.js和npm&#xff08;Node Packaged Modules&#xff09;。你可以通过以下命令检查是否已经安装&#xff1a;shell 或者 node -v 或者 npm -v 数据库连接代码 1.导入MySQL2库 npm install mysql2 2.在文件…...

Canvas:AI协作的新维度

在人工智能的浪潮中&#xff0c;OpenAI的最新力作Canvas&#xff0c;不仅是一款新工具&#xff0c;它标志着人工智能协作方式的一次革命性飞跃。Canvas为写作和编程提供了一个全新的交互界面&#xff0c;让用户能够与ChatGPT进行更紧密、更直观的协作。 ​​​​​​​ Canvas的…...

【深度学习】— softmax回归、网络架构、softmax 运算、小批量样本的向量化、交叉熵

【深度学习】— softmax回归、网络架构、softmax 运算、小批量样本的向量化、交叉熵 3.4 Softmax 回归3.4.1 分类问题3.4.2 网络架构 3.4.3 全连接层的参数开销3.4.4 softmax 运算3.4.5 小批量样本的向量化3.4.6 损失函数对数似然softmax 的导数 3.4.7 信息论基础熵信息量重新审…...

C# Wpf 图片按照鼠标中心缩放和平移

C# Wpf 图片按照鼠标中心缩放和平移 1、缩放事件 MouseWheel(object sender, MouseWheelEventArgs e)2、平移相关的事件 MouseMove(object sender, MouseEventArgs e) MouseDown(object sender, MouseButtonEventArgs e) MouseUp(object sender, MouseButtonEventArgs e)3、…...

网络安全产品类型

1. 防火墙&#xff08;Firewall&#xff09; 功能&#xff1a;防火墙是网络安全的第一道防线&#xff0c;通过检查进出网络的流量来阻止未经授权的访问。它可以基于预定义的安全规则&#xff0c;过滤数据包和阻止恶意通信。 类型&#xff1a; 硬件防火墙&#xff1a;以专用设备…...

【开源风云】从若依系列脚手架汲取编程之道(五)

&#x1f4d5;开源风云系列 &#x1f34a;本系列将从开源名将若依出发&#xff0c;探究优质开源项目脚手架汲取编程之道。 &#x1f349;从不分离版本开写到前后端分离版&#xff0c;再到微服务版本&#xff0c;乃至其中好玩的一系列增强Plus操作。 &#x1f348;希望你具备如下…...

金融市场的衍生品交易及其风险管理探讨

金融衍生品市场是现代金融体系的重要组成部分&#xff0c;其交易量和复杂性在过去几十年中迅速增长。衍生品&#xff0c;如期权、期货、掉期等&#xff0c;因其灵活性和杠杆效应&#xff0c;广泛应用于风险管理、投机和资产配置等多个领域。本文将探讨金融衍生品交易的关键特点…...

一、创建型(单例模式)

单例模式 概念 单例模式是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。它控制类的实例化过程&#xff0c;防止外部代码创建新的实例。 应用场景 日志记录&#xff1a;确保只有一个日志记录器&#xff0c;以便于管理和避免重复记…...

毕业设计项目-古典舞在线交流平台的设计与实现(源码/论文)

项目简介 基于springboot实现的&#xff0c;主要功能如下&#xff1a; 技术栈 后端框框&#xff1a;springboot/mybatis 前端框架&#xff1a;html/JavaScript/Css/vue/elementui 运行环境&#xff1a;JDK1.8/MySQL5.7/idea&#xff08;可选&#xff09;/Maven3&#xff08…...

【秋招笔试】10.09华子秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 本次的三题全部上线…...

【算法笔记】双指针算法深度剖析

【算法笔记】双指针算法深度剖析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;算法笔记 文章目录 【算法笔记】双指针算法深度剖析前言一.移动零1.1题目1.2思路分析1.3代码实现 二.复写零2.1题目2.2思路分析2.3代码实现 三.快乐数3.1题目…...

第二十二天|回溯算法| 理论基础,77. 组合(剪枝),216. 组合总和III,17. 电话号码的字母组合

目录 回溯算法理论基础 1.题目分类 2.理论基础 3.回溯法模板 补充一个JAVA基础知识 什么时候用ArrayList什么时候用LinkedList 77. 组合 未剪枝优化 剪枝优化 216. 组合总和III 17. 电话号码的字母组合 回溯法的一个重点理解&#xff1a;细细理解这句话&#xff01;…...