OpenHarmony网络协议通信—kcp

ops/2024/11/13 15:25:33/

kcp 是一种 ARQ 协议,可解决在网络拥堵情况下 tcp 协议的网络速度慢的问题

下载安装

直接在 OpenHarmony-SIG 仓中搜索 kcp 并下载。

使用说明

准备一套完整的 OpenHarmony 3.1 Beta 代码

  1. 库代码存放路径:./third_party/kcp

  2. 修改添加依赖的编译脚本

在/developtools/bytrace_standard/ohos.build 文件中添加以下修改:

{"subsystem": "developtools","parts": {"bytrace_standard": {"module_list": ["//developtools/bytrace_standard/interfaces/innerkits/native:bytrace_core","//developtools/bytrace_standard/bin:bytrace_target","//developtools/bytrace_standard/bin:bytrace.cfg","//developtools/bytrace_standard/interfaces/kits/js/napi:bytrace","//third_party/kcp:kcp_targets"],"inner_kits": [{"type": "so","name": "//developtools/bytrace_standard/interfaces/innerkits/native:bytrace_core","header": {"header_files": ["bytrace.h"],"header_base": "//developtools/bytrace_standard/interfaces/innerkits/native/include"}}],"test_list": ["//developtools/bytrace_standard/bin/test:unittest"]}}
}
  1. 用命令 ./build.sh --product-name rk3568 --ccache 编译

  2. 生成库文件路径:

    out/rk3568/common/common

该路径会生成 test 可执行文件

接口说明

  1. 接收到下层协议 UDP 传进来的数据底层数据 buffer 转换成 kcp 的数据包格式 int ikcp_input(ikcpcb *kcp, const char *data, long size) KCP 报文分为 ACK 报文、数据报文、探测窗口报文、响应窗口报文四种。 kcp 报文的 una 字段(snd_una:第一个未确认的包)表示对端希望接收的下一个 kcp 包序号,也就是说明接收端已经收到了所有小于 una 序号的 kcp 包。解析 una 字段后需要把发送缓冲区里面包序号小于 una 的包全部丢弃掉

  2. 用户层面的数据读取

ikcp_recv(ikcpcb *kcp, char *buffer, int len)

首先合并 fragment,如果 rcv_queue 小于 rcv_wnd(接收窗口大小),则将 rcv_buf 中合适的 segment 放入 rcv_queue 中

  1. 将 buffer 中的数据发送,把要发送的 buffer 分片成 KCP 的数据包格式,插入待发送队列中

ikcp_send(ikcpcb *kcp, const char *buffer, int len)

当用户的数据超过一个 mss(最大分片大小)的时候,会对发送的数据进行分片处理。KCP 采用的是流的方式进行分片处理

如果需要发送的数据大小大于 mss,则将其拆分为多个 segment 发送,将其 frg 至为其相应的序号,序号从 count-1 开始递减至 0,即 count-1 表示第一个 segment,0 表示最后一个 segment。

  1. 刷新待处理数据,待处理数据包括 ack,win probe,push data 等等,以及检测 snd_buf 中的数据是否需要重传

ikcp_flush(ikcpcb *kcp)

约束与限制

在下述版本验证通过:DevEco Studio: 3.1 Beta1,OpenHarmony SDK: API9。

目录结构

|---- kcp
|     |---- ikcp.c   #kcp的主要实现逻辑
|     |---- test.c   #测试代码文件
|     |---- screenshot   #测试结果图

http://www.ppmy.cn/ops/5813.html

相关文章

Hive基础3

一、表的分区 大数据开发数据量较大,在进行数据查询计算时,需要对数据进行拆分,提升的查询速度 1-1 单个分区 单个分区是创建单个目录 -- 创建表指定分区,对原始数据进行分区保存 create table new_tb_user(id int,name string,ag…

计算机网络的七层模型

序 OSl(Open System Interconnect),即开放式系统互联。一般都叫OSI参考模型。在网络编程中最重要的模型就是OSI七层网络模型和TCP/IP四层网络模型 一、OSI七层参考模型以及功能概述 二、各层的具体职能以及实际应用 1.应用层: OSI参考模型中最接近用…

springboot WebFilter+@Component urlPatterns 全部拦截

问题描述 WebFilter(filterName “ssoFilter”,urlPatterns “/*”)配置 Order中的value越小,优先级越高。 解决方法一: 在springboot启动类上添加 ServletComponentScan(basePackages “com.package.path”) 解决方法二: 手动配置bean(…

迁移学习入门

参考文献 [1]迁移学习与领域自适应:如何让模型更好地适应新的任务 [2]迁移学习与多模态数据处理的结合与应用 [3]Domain Adaptation(领域自适应,MMD,DANN) [4]迁移学习与多模态学习:实现跨模态知识传递 [5…

Linux编辑器gcc/g++的使用以及Makefile的用法

gcc如何完成 格式 gcc [选项] 要编译的文件 [选项] [目标文件] gcc对code.c编译形成可执行文件mybin,十分推荐直接这样写,下面会有拆分写法(不推荐) gcc与我们使用过的编辑器无二,都需要经过 1. 预处理(…

UE4_动画基础_动画重定位原理

动画重定位 是一种允许在共用相同骨架资源但比例差异很大的角色之间复用动画的功能。通过重定位,可以防止生成动画的骨架在使用来自不同外形的角色的动画时丢失比例或产生不必要的变形。 通过动画重定位,还可以在使用 不同骨架 资源的角色之间共享动画&a…

【LeetCode热题100】【图论】实现 Trie (前缀树)

题目链接:208. 实现 Trie (前缀树) - 力扣(LeetCode) 这应该和图论没啥关系,应该属于哈希和树,题目没讲前缀树到达是啥 前缀树是如何做到高效查找字符串的呢,先说单词查找树吧,一共就只有26个…

Docker Desktop 卡死在 “Starting the Docker Engine“问题解决

docker desktop启动卡死在这个界面长时间没有反应 wsl --status输入以上命令查看wsl状态,发现也是卡死的状态,长时间没有反应,猜测是因为WSL卡死导致的docker desktop卡死的 netsh winsock reset通过以上命令重置 重启电脑后问题解决