UIP协议栈 TCP通信客户端 服务端,UDP单播 广播通信 example
文章目录
- 1. TCP通信 客户端(关键配置)
- 2. TCP 服务端配置
- 3. UDP 点播通信
- 4. UDP 广播通信
- 5. UIP_UDP_APPCALL 里边的处理example
- 6. TCP数据处理 ,UIP_APPCALL调用的函数
UIP_APPCALL TCP的数据都在这个宏定义的函数里进行数据处理的
UDP 数据在#define UIP_UDP_APPCALL udp_appcall 中处理
1. TCP通信 客户端(关键配置)
// 定义 MAC 地址(6 字节)static const uint8_t mac_address[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55};// 设置 MAC 地址memcpy(ethaddr.addr, mac_address, sizeof(mac_address));uip_setethaddr(ethaddr);uip_ipaddr_t ipaddr;uip_init(); // uIP初始化uip_ipaddr(ipaddr, 192, 168, 1, 137); // 设置本地设置IP地址uip_sethostaddr(ipaddr);uip_ipaddr(ipaddr, 192, 168, 1, 1); // 设置网关IP地址(其实就是你路由器的IP地址)uip_setdraddr(ipaddr);uip_ipaddr(ipaddr, 255, 255, 255, 0); // 设置网络掩码uip_setnetmask(ipaddr);uip_ipaddr_t ipaddr;uip_ipaddr(&ipaddr, 192, 168, 1, 100); // 设置TCP Server IP为192.168.1.100uip_connect(&ipaddr, htons(8080)); // 端口为1400
2. TCP 服务端配置
uip_ipaddr_t ipaddr, remote_ip;// 定义 MAC 地址(6 字节)static const uint8_t mac_address[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55};// 设置 MAC 地址memcpy(ethaddr.addr, mac_address, sizeof(mac_address));uip_setethaddr(ethaddr);// uIP初始化uip_init();/* ARP table initialize. */uip_arp_init();/*-----------UIP-TCP-Server---------------------*/// 设置本地设置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));/*-----------UIP-TCP-Server---------------------*/
3. UDP 点播通信
uip_ipaddr_t remote_addr;struct uip_udp_conn *udp_conn;// 设置远程主机的 IP 地址为 192.168.1.100uip_ipaddr(&remote_addr, 192, 168, 1, 100);// 创建到 remote 192.168.1.100:1215 的 UDP 连接udp_conn = uip_udp_new(&remote_addr, HTONS(1215));if (udp_conn == NULL){UART1_Send_String("Failed to create UDP connection! \r\n");}else{uip_udp_bind(udp_conn, HTONS(1234)); // 绑定本地端口 1234}
4. UDP 广播通信
UDP 广播需要打开这个宏
#ifndef UIP_CONF_BROADCAST
#define UIP_BROADCAST 1
#else /* UIP_CONF_BROADCAST /
#define UIP_BROADCAST UIP_CONF_BROADCAST
#endif / UIP_CONF_BROADCAST */
/*Broadcast IP ADDR*/uip_ipaddr_t Broadcast_addr;struct uip_udp_conn *udp_conn;// UDP广播地址,本局域网中的所有设备uip_ipaddr(&Broadcast_addr, 255, 255, 255, 255);/*UDP 广播端口1212*/udp_conn = uip_udp_new(&Broadcast_addr, HTONS(0));if (udp_conn == NULL){UART1_Send_String("Failed to create UDP connection! \r\n");}else{uip_udp_bind(udp_conn, HTONS(3956));}
5. UIP_UDP_APPCALL 里边的处理example
/*udp rx data*/if (uip_newdata()){#if (USE_GVCP==1)gvcp_discover_callback();#elsechar *data = (char *)uip_appdata;int len = uip_datalen();memset(udp_server_databuf, 0, 1500);memcpy((char *)udp_server_databuf,(char *)uip_appdata,uip_len);// 打印接收到的数据UART1_Send_String("[UDP_RX]:");UART1_Send_String(udp_server_databuf);UART1_Send_String("\r\n");#endif}// 当需要重发、新数据到达、数据包送达,通知uip发送数据if (uip_rexmit() || uip_newdata() || uip_poll()){#if (USE_GVCP==1)#else// 将数据复制到 uIP 的应用层数据缓冲区memcpy(uip_appdata, message, sizeof(message));// 发送数据uip_udp_send(sizeof(message)); // 发送的字节数#endif}
6. TCP数据处理 ,UIP_APPCALL调用的函数
/*** @brief 这是一个TCP 服务器应用回调函数。* 该函数通过UIP_APPCALL(tcp_demo_appcall)调用,实现Web Server的功能.* 当uip事件发生时,UIP_APPCALL函数会被调用,根据所属端口(1200),确定是否执行该函数。* 例如 : 当一个TCP连接被创建时、有新的数据到达、数据已经被应答、数据需要重发等事件*/
void tcp_server_demo_appcall(void)
{// 连接终止if (uip_aborted()){uip_log("TCP_Server Aborted!\r\n"); // 打印log}// 连接超时if (uip_timedout()){uip_log("TCP_Server Timeout!\r\n"); // 打印log}// 连接关闭if (uip_closed()){uip_log("TCP_server CLOSED!\r\n"); // 打印log}// 连接成功if (uip_connected()){uip_log("TCP_Server Connected OK!\r\n"); // 打印log}// 发送的数据成功送达if (uip_acked()){// uip_log("TCP_Server ACK OK!\r\n");}else{/*数据发送失败*/// uip_log("TCP_Server NOT ACK!\r\n");}/* 接收到一个新的TCP数据包,收到客户端发过来的数据*/if (uip_newdata()){memcpy(&request, uip_appdata, uip_len);if (PROTOCOL_REQUEST_MAGIC == request.header.nMagic){// uip_log("Recive APP SDK Update!\r\n");protocol_handle_request(&request, &response);}else{uip_log("Recive APP Bin data ERROR! \r\n");}uip_send(&response, response.buf.len);}}/*** @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}
相关文章:
UIP协议栈 TCP通信客户端 服务端,UDP单播 广播通信 example
文章目录 1. TCP通信 客户端(关键配置)2. TCP 服务端配置3. UDP 点播通信4. UDP 广播通信5. UIP_UDP_APPCALL 里边的处理example6. TCP数据处理 ,UIP_APPCALL调用的函数 UIP_APPCALL TCP的数据都在这个宏定义的函数里进行数据处理的 UDP 数据…...
【NoSQL系列】为什么要使用Redis?
第一次知道Redis是以前准备面试的时候,只知道是用来缓存数据的。随着这几年的工作,对软件的认识从盲人摸象到睁眼看世界。 在常用的软件架构评价模型中,性能、可用性、安全性和可维护性是常见的评价属性,客户总希望系统响应又快有…...
MySQL Explain 分析SQL语句性能
一、EXPLAIN简介 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 (1) 通过EXPLAIN,我们可以分析出以下结果: 表的读取顺序数据读取…...
IIS部署程序https是访问出现403或ERR_HTTP2_PROTOCOL_ERROR
一、说明 在windows server 2016中的IIS程序池里部署一套系统,通过https访问站点,同时考虑到安全问题以及防攻击等行为,就用上了WAF云盾功能,能有效的抵挡部分攻击,加强网站的安全性和健壮性。 应用系统一直能够正常…...
学技术学英文:代码中的锁:悲观锁和乐观锁
本文导读: 1. 举例说明加锁的场景: 多线程并发情况下有资源竞争的时候,如果不加锁,会出现数据错误,举例说明: 业务需求:账户余额>取款金额,才能取钱。 时间线 两人共有账户 …...
青少年编程与数学 02-004 Go语言Web编程 02课题、依赖管理
青少年编程与数学 02-004 Go语言Web编程 02课题、依赖管理 课题摘要:一、项目结构各目录说明: 二、依赖项三、依赖管理任务四、依赖管理步骤1. 初始化Go Modules项目2. 添加依赖3. 指定依赖版本4. 更新依赖5. 清理未使用的依赖6. 离线工作7. 模块隔离8. 可重现构建 …...
MyBatis写法汇总
Mybatis写法汇总 1. 批量操作 1.1 批量插入 <insert id"batchInsert" parameterType"java.util.List">INSERT INTO user (username, password, create_time) VALUES<foreach collection"list" item"item" separator"…...
【Linux学习】十五、Linux/CentOS 7 用户和组管理
文章目录 一、组的管理1.组的创建格式:参数: 2.组的删除格式:参数: 3.组的属性修改格式:参数: 4.查看组的信息①cat /etc/group 命令②getent group 命令③仅显示系统中所有组名 二、用户的管理①超级用户&…...
三维无人机航迹算法的目标函数如何确定
一、定义目标函数 在三维无人机航迹算法中,目标函数的确定通常基于具体的任务需求和飞行约束。以下是一个简单的例子,展示了如何为三维无人机航迹规划定义一个目标函数。 例子:最小化飞行时间和避障的三维无人机航迹规划 1.任务描述:无人机需要从起点飞到终点,同时避开一些…...
uniapp v-tabs修改了几项功能,根据自己需求自己改
根据自己的需求都可以改 这里写自定义目录标题 1.数组中的名字过长,导致滑动异常2.change 事件拿不到当前点击的数据,通过index在原数组中查找得到所需要的id 各种字段麻烦3.添加指定下标下新加红点显示样式 1.数组中的名字过长,导致滑动异常…...
用vscode,进行vue开发
使用Visual Studio Code(VSCode)进行Vue.js开发是一个很好的选择,因为VSCode提供了强大的编辑功能以及丰富的插件生态。以下是使用VSCode进行Vue开发的基本步骤: 1. 安装Node.js和npm 首先,确保你的计算机上安装了No…...
Kafka 磁道寻址过程详解
前言 Apache Kafka 是一款高吞吐、分布式的消息流平台,广泛应用于实时数据处理和事件驱动系统。在 Kafka 中,消息是存储在磁盘上的,这种高效的数据读写性能得益于 Kafka 独特的磁盘存储架构和寻址机制。本文将从 Kafka 的存储结构、磁道寻址…...
基于Spring Boot的社区药房系统
一、系统背景与目的 随着医疗改革的深入和社区医疗服务的不断完善,社区药房在居民健康保障中扮演着越来越重要的角色。然而,传统的药房管理方式存在着库存管理混乱、药品销售不透明、客户信息管理不规范等问题。为了解决这些问题,基于Spring…...
005 QT常用控件Qwidget_上
文章目录 前言控件概述QWidgetenable属性geometry属性windowTitle属性windowlcon属性 小结 前言 本文将会向你介绍常用的Qwidget属性 控件概述 Widget 是 Qt 中的核心概念. 英文原义是 “⼩部件”, 我们此处把它翻译为 “控件” . 控件是构成⼀个图形化界面的基本要素. QWi…...
机器学习之交叉熵
交叉熵(Cross-Entropy)是机器学习中用于衡量预测分布与真实分布之间差异的一种损失函数,特别是在分类任务中非常常见。它源于信息论,反映了两个概率分布之间的距离。 交叉熵的数学定义 对于分类任务,假设我们有&#…...
数据结构 ——前缀树查词典的实现
数据结构 ——前缀树查词典的实现 一、前缀树的概念 前缀树是一种多叉树结构,主要用于存储字符串。每个节点代表一个字符,路径从根节点到叶节点表示一个完整的字符串。前缀树的关键特征是 共享前缀,也就是说,如果两个字符串有相…...
MySQL 主从复制与高可用架构
一、MySQL 主从复制概述 (一)定义与作用 MySQL 主从复制是一种允许在多个 MySQL 数据库服务器之间进行数据同步的技术。简单来说,就是可以把数据从一个 MySQL 服务器(主服务器、主节点)复制到一个或多个从节点&#…...
【Golang】如何读取并解析SQL文件
一、背景 在数据库开发与维护过程中,我们经常需要执行大量的SQL语句。有时,这些SQL语句会被保存在一个文件中,以便于批量执行。为了方便地在Go语言中处理这些SQL文件,我们可以编写一个函数来读取并解析SQL文件中的语句。 二、实…...
git branch -r(--remotes )显示你本地仓库知道的所有 远程分支 的列表
好的,git branch -r 这个命令用于列出远程分支。让我详细解释一下: 命令: git branch -rdgqdgqdeMac-mini ProductAuthentication % git branch -rorigin/main作用: 这个命令会显示你本地仓库知道的所有 远程分支 的列表。它不…...
Typescript安装
建议全局安装npm i -g typescript安装好之后,就可以直接使用 tsc 来编译 ts 文件了可通过 tsc 回车查看 tsc 的各项配置信息,通过 tsc --version 查看版本号。编译我们现在可以创建一个 ts 文件,并将他编译成 js 文件,比如下面简单…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
