网络数据同步开发库libsync

使用Lipsync插件做中文口形动画 LipSync主要由三个模块组成。 ·前端负责分析语音,辨识指定的音节,输出位置、类型和强度。LipSyncPro的作者直接使用了PocketSphinx开源库来完成这部分的内容。 ·中端没有明确的界限,负责将语音识别的结果转化为驱动表情动画的事件帧。LipSync中提供一个ClipEditor,界面功能全面,可以方便的增减和编辑AutoSync生成的帧信息。 *前端和中端都是在编辑器中离线... 阅读详情

"数据同步算法研究"一文提出了一种改进的数据同步算法,我在实现的原型系统基础上,将文件切分、差异编码、文件同步等关键算法抽取出来封装成动态开发库libsync,方便自己的开发应用。在本人开发的deduputil,WSIO, wsync等软件中,均使用了libsync动态函数库,现已将libsync发布至google code。libsync函数库由提供三个API,原型描述如下:

1、int file_chunk(char *src_filename, char *chunk_filename, int chunk_algo)
功能:对件进行切分生成分块描述文件。
参数:src_filename为切分文件,chunk_filename为生成的块信息描述文件,chunk_algo为文件切分算法,目前支持定长FSP切分(Ffixed-size partition)、CDC切分(content-defined chunking)和滑动块(sliding block)切分三种。

2、int file_delta(char *src_filename, char *chunk_filename, char *delta_filename, int chunk_algo)
功能:使用生成的块描述信息对文件进行差异编码。
参数:src_filename为待编码文件,chunk_filename为通过函数file_chunk生成的块描述文件,chunk_algo为文件切分算法。

3、int file_sync(char *src_filename, char *delta_filename)
功能:使用差异编码文件将源文件同步至目标文件。
参数:src_filename为基本文件,delta_filename为通过函数file_delta生成的差异编码文件。

  1. /* 
  2.   Copyright (C) 2010, Aigui Liu 
  3.                                                                                                     
  4.   Filename: sync.h 
  5.   Author: Aigui.Liu@gmail.com 
  6.  */  
  7. #ifndef _SYNC_H  
  8. #define _SYNC_H  
  9. #include <stdint.h>  
  10. #define BLOCK_SZ        2048  
  11. #define BLOCK_MIN_SZ    1024  
  12. #define BLOCK_MAX_SZ    4096  
  13. #define BLOCK_WIN_SZ    48  
  14. #define NAME_MAX_SZ     256  
  15. #define BUF_MAX_SZ      32768  
  16. #define HASHTABLE_BUCKET_SZ 1024  
  17. #define CHUNK_CDC_D     BLOCK_SZ  
  18. #define CHUNK_CDC_R     13  
  19. enum chunk_algo {  
  20.     CHUNK_FSP = 0,  /* fixed-size partition */  
  21.     CHUNK_CDC,      /* content-define chunking */  
  22.     CHUNK_SBC       /* slide block chunking */  
  23. };  
  24. /* define chunk file header and block entry */  
  25. typedef struct _chunk_file_header {  
  26.     uint32_t block_sz;  
  27.     uint32_t block_nr;  
  28. } chunk_file_header;  
  29. #define CHUNK_FILE_HEADER_SZ    (sizeof(chunk_file_header))  
  30. typedef struct _chunk_block_entry {  
  31.     uint64_t offset;  
  32.     uint32_t len;  
  33.     uint8_t  md5[16 + 1];  
  34.     uint8_t  csum[10 + 1];  
  35. } chunk_block_entry;  
  36. #define CHUNK_BLOCK_ENTRY_SZ    (sizeof(chunk_block_entry))  
  37. /* define delta file header and block entry */  
  38. typedef struct _delta_file_header {  
  39.     uint32_t block_nr;  
  40.     uint32_t last_block_sz;  
  41.     uint64_t last_block_offset;  /* offset in delta file */  
  42. } delta_file_header;  
  43. #define DELTA_FILE_HEADER_SZ    (sizeof(delta_file_header))  
  44. typedef struct _delta_block_entry {  
  45.     uint64_t offset;  
  46.     uint32_t len;  
  47.     uint8_t  embeded; /* 1, block in delta file; 0, block in source file. */  
  48. } delta_block_entry;  
  49. #define DELTA_BLOCK_ENTRY_SZ    (sizeof(delta_block_entry))  
  50. int file_chunk(char *src_filename, char *chunk_filename, int chunk_algo);  
  51. int file_delta(char *src_filename, char *chunk_filename, char *delta_filename, int chunk_algo);  
  52. int file_sync(char *src_filename, char *delta_filename);  
  53. #endif  

数据同步有PULL和PUSH两种应用模式,PULL是将远程数据同步到本地,而PUSH是将本地数据同步到远程。对应到同步算法,主要区别在于数据分块和差异编码位置不同。PULL和PUSH同步模式步骤分别如下所述。

PULL同步模式流程:
1、本地对文件A进行数据切分,生成数据块描述文件chunk;
2、上传chunk文件至远程服务器;
3、远程服务器对文件B进行差异编码,生成差异编码文件delta;
4、下载delta文件至本地;
5、本地同步文件A至文件B,相当于下载文件B到本地文件A。

例子程序:

  1. /* 
  2.   Copyright (c) 2010, Aigui Liu 
  3.   All rights reserved. 
  4.   
  5.   Filename: wspull.c  
  6.   Author: Aigui.Liu@gmail.com 
  7. */  
  8. #include <stdio.h>  
  9. #include <stdlib.h>  
  10. #include <string.h>  
  11. #include <fcntl.h>  
  12. #include <unistd.h>  
  13. #include "wsioclient.h"  
  14. #include "wsio_api.h"  
  15. #include "sync.h"  
  16. /* main function */  
  17. int main(int argc, char **argv)  
  18. {   
  19.     char fap[32] = {0};  
  20.     char server[256] = {0};  
  21.     char *local_filename = NULL;  
  22.     char remote_filename[256] = {0};  
  23.     char local_chunkname[256] = {0};  
  24.     char remote_chunkname[256] = {0};  
  25.     char local_deltaname[256] = {0};  
  26.     char remote_deltaname[256] = {0};  
  27.     int ret = 0;  
  28.     if (argc < 3) {   
  29.         fprintf(stderr, "Usage: wspull remote_filename local_filename/n");  
  30.         exit(0);  
  31.     }  
  32.     
  33.     if(argv[1]) {  
  34.         if(parseURL(argv[1], fap, server, remote_filename) == -1) {  
  35.             fprintf(stderr, "wsio address is illegal/n");  
  36.             exit(1);  
  37.         }  
  38.     }  
  39.     wsio_init(fap, server);  
  40.     local_filename = argv[2];  
  41.     if (0 == access(local_filename, F_OK)) {  
  42.         sprintf(local_chunkname, "%s_%d", tmpnam(NULL), getpid());  
  43.         sprintf(remote_chunkname, "%s_%d", tmpnam(NULL), getpid());  
  44.         sprintf(local_deltaname, "%s_%d", tmpnam(NULL), getpid());  
  45.         sprintf(remote_deltaname, "%s_%d", tmpnam(NULL), getpid());  
  46.         ret = file_chunk(local_filename, local_chunkname, CHUNK_CDC);  
  47.         if (ret == -1) {  
  48.             fprintf(stderr, "local file chunking failed/n");  
  49.             return -1;  
  50.         }  
  51.         ret = wsio_putfile(local_chunkname, remote_chunkname);  
  52.         if (ret == -1) {  
  53.             fprintf(stderr, "upload chunking file failed/n");  
  54.             return -1;  
  55.         }  
  56.         ret = wsio_deltafile(remote_filename, remote_chunkname, remote_deltaname, CHUNK_CDC);  
  57.         if (ret == -1) {  
  58.             fprintf(stderr, "remote file delta coding failed/n");  
  59.             return -1;  
  60.         }  
  61.         ret = wsio_getfile(remote_deltaname, local_deltaname);  
  62.         if (ret == -1) {  
  63.             fprintf(stderr, "download delta file failed/n");  
  64.         }  
  65.         ret = file_sync(local_filename, local_deltaname);  
  66.         if (ret == -1) {  
  67.             fprintf(stderr, "local file sync failed/n");  
  68.             return -1;  
  69.         }  
  70.     } else {  
  71.         ret = wsio_getfile(remote_filename, local_filename);  
  72.         if (ret == -1) {  
  73.             fprintf(stderr, "download file failed/n");  
  74.             return -1;  
  75.         }  
  76.     }  
  77.     wsio_unlink(remote_chunkname);  
  78.     wsio_unlink(remote_deltaname);  
  79.     unlink(local_chunkname);  
  80.     unlink(local_deltaname);  
  81.     wsio_destroy();  
  82.     fprintf(stderr, "pull %s to %s %s/n", argv[1], local_filename, (ret == 0)? "sucessfully" : "failed");  
  83.     return 0;  
  84. }  
 

PUSH同步模式流程:
1、远程服务器对文件B进行数据切分,生成数据块描述文件chunk;
2、下载chunk文件至本地;
3、本地对文件A进行差异编码,生成差异编码文件delta;
4、上传delta文件至远程服务器;
5、远程同步文件B到A,相当于上传文件A到远程文件B。

例子程序:

  1. /* 
  2.   Copyright (c) 2010, Aigui Liu 
  3.   All rights reserved. 
  4.   
  5.   Filename: wspush.c  
  6.   Author: Aigui.Liu@gmail.com 
  7. */  
  8. #include <stdio.h>  
  9. #include <stdlib.h>  
  10. #include <string.h>  
  11. #include <fcntl.h>  
  12. #include <unistd.h>  
  13. #include "wsioclient.h"  
  14. #include "wsio_api.h"  
  15. #include "sync.h"  
  16. /* main function */  
  17. int main(int argc, char **argv)  
  18. {   
  19.     char fap[32] = {0};  
  20.     char server[256] = {0};  
  21.     char remote_filename[256] = {0};  
  22.     char *local_filename = NULL;  
  23.     char local_chunkname[256] = {0};  
  24.     char remote_chunkname[256] = {0};  
  25.     char local_deltaname[256] = {0};  
  26.     char remote_deltaname[256] = {0};  
  27.     int ret = 0;  
  28.     if (argc < 3) {   
  29.         fprintf(stderr, "Usage: wspush local_filename remote_filename/n");  
  30.         exit(0);  
  31.     }  
  32.     
  33.     if(argv[2]) {  
  34.         if(parseURL(argv[2], fap, server, remote_filename) == -1) {  
  35.             fprintf(stderr, "wsio address is illegal/n");  
  36.             exit(1);  
  37.         }  
  38.     }  
  39.     wsio_init(fap, server);  
  40.     local_filename = argv[1];  
  41.     if (0 == wsio_access(remote_filename, F_OK)) {  
  42.         sprintf(local_chunkname, "%s_%d", tmpnam(NULL), getpid());  
  43.         sprintf(remote_chunkname, "%s_%d", tmpnam(NULL), getpid());  
  44.         sprintf(local_deltaname, "%s_%d", tmpnam(NULL), getpid());  
  45.         sprintf(remote_deltaname, "%s_%d", tmpnam(NULL), getpid());  
  46.         ret = wsio_chunkfile(remote_filename, remote_chunkname, CHUNK_CDC);  
  47.         if (ret == -1) {  
  48.             fprintf(stderr, "remote file chunking failed/n");  
  49.             return -1;  
  50.         }  
  51.         ret = wsio_getfile(remote_chunkname, local_chunkname);  
  52.         if (ret == -1) {  
  53.             fprintf(stderr, "download chunking file failed/n");  
  54.             return -1;  
  55.         }  
  56.         ret = file_delta(local_filename, local_chunkname, local_deltaname, CHUNK_CDC);  
  57.         if (ret == -1) {  
  58.             fprintf(stderr, "local file delta coding failed/n");  
  59.             return -1;  
  60.         }  
  61.         ret = wsio_putfile(local_deltaname, remote_deltaname);  
  62.         if (ret == -1) {  
  63.             fprintf(stderr, "upload delta file failed/n");  
  64.         }  
  65.         ret = wsio_syncfile(remote_filename, remote_deltaname);  
  66.         if (ret == -1) {  
  67.             fprintf(stderr, "remote file sync failed/n");  
  68.             return -1;  
  69.         }  
  70.     } else {  
  71.         ret = wsio_putfile(local_filename, remote_filename);  
  72.         if (ret == -1) {  
  73.             fprintf(stderr, "upload file failed/n");  
  74.             return -1;  
  75.         }  
  76.     }  
  77.     wsio_unlink(remote_chunkname);  
  78.     wsio_unlink(remote_deltaname);  
  79.     unlink(local_chunkname);  
  80.     unlink(local_deltaname);  
  81.     wsio_destroy();  
  82.     fprintf(stderr, "push %s to %s %s/n", local_filename, remote_filename, (ret == 0)? "sucessfully" : "failed");  
  83.     return 0;  
  84. }  

Linux rsync 使用文档 rsync是一个功能强大的Linux命令行工具,用于实现文件的快速、安全和高效同步。它可以在本地或远程主机之间复制、备份和同步文件和目录。 阅读详情

相关推荐

librsync:带优化的 Librsync 克隆

图书馆同步 librsync 实现了由 rsync 实用程序推广的远程文件同步的滚动校验和算法。 该算法传输两个文件之间的差异,而无需在同一系统上使用这两个文件。 librsync没有实现 rsync 线路协议。 如果您想与 rsync 服务器交谈以传输文件,则需要将其转为rsync 。 librsync 用于构建与 rsync 一样高效地传输文件的其他程序。 您可以使用 librsync 制作备份工具,将二进制补丁分发到程序,或将目录同步到服务器或对等点之间。 该树还生成rdiff命令行工具,该工具公开了 librsync 的关键操作:生成文件签名、从签名生成新文件的增量,以及应用该增量以在给定旧文件的情况下重新生成新文件。 版权 librsync 版权所有 1999-2014 Martin Pool 和其他人。 librsync 在 GNU LGPL v2.1 下分发(请参阅复

librsync增量更新api测试

简单测试librsync几个接口,流程如下: rs_sig_file()创建签名文件 rs_loadsig_file()加载签名文件至内存 rs_build_hash_table()建立哈希表 rs_delta_file()同步增量文件 progress_timer t; cout << "testconsole.................." << endl; cout << "version: " << rs_librsyn

涟漪、的博客 7021

librsync源码

librync.so 的源码,提供客户端测试工具

从源码级看MCP状态同步:深入libsync.so 2.3.1内核模块的11个状态机跃迁条件与安装校验钩子点

深入剖析MCP客户端状态同步机制插件下载与安装全流程,基于libsync.so 2.3.1源码揭示11个状态机跃迁条件与5类安装校验钩子点,适用于高并发终端环境。精准定位同步异常与安装失败根因,提升部署可靠性与调试效率,值得收藏。

LearnPlex的博客 216

rsync的linux库

librsync,主要包括rsync的算法,使用平台:linux

librsync.net:Librsync算法的C#实现

librsync.net librsync.net是rsync实用程序使用的滚动校验和算法的C#实现。 librsync.net旨在与librsync库( )兼容。 但是,这是该算法的全新实现。 此实现仅支持BLAKE2哈希函数。 根据 (根据CC0许可证发布)中的代码,包含了一个dll来计算此功能。 用法 要在您的应用程序中使用该库,只需添加对该dll的引用。 该库支持三种操作: Librsync.ComputeSignature-这将获取一个输入文件并从中计算一个“签名”。 Librsync.ComputeDelta-这将获取文件的签名和新版本,并计算代表原始版本与新版本之间差异的增量 Librsync.ApplyDelta-这将使用文件的旧版本并应用增量以提供新版本 远程同步的示例 要通过差异同步上传文件,请执行以下操作: 客户端请求服务器版本的签名。 客户端计算其版

5个核心工具:Windows漏洞利用开发的效率提升指南

OSED-Scripts 是一个专为 Windows 用户模式漏洞利用开发(OSED课程)量身定制的工具集,旨在简化二进制安全研究流程,提升漏洞利用开发效率。该项目提供了一系列自动化脚本,帮助安全研究人员快速定位关键代码片段、生成有效载荷,并优化调试过程。 --- ## 🚀 快速上手:如何开始使用OSED工具集 要开始使用这个强大的工具集,首先需要克隆项目仓库并安装必要的依赖: ```b

gitblog_00422的博客 338

从零开始使用matlab实现EKF-SLAM算法(含完整代码)

扩展卡尔曼滤波器同步定位与建图 (EKF-SLAM) 算法建立在 EKF 的基础上,集成了 EKF 的功能,可解决机器人技术中最具挑战性的问题之一:同时定位与建图 (SLAM)。 EKF-SLAM采用EKF方法来同时估计机器人的状态和周围环境的布局,而无需事先了解位置。 这种双重功能对于在未知环境中运行的自主系统至关重要,使它们能够在绘制区域地图时有效导航。 EKF-SLAM 算法一直是自动驾驶车辆和机器人系统开发的基石,为处理现实世界环境中固有的不确定性提供了一个强大的框架。

mjmmm的博客 6635

Ladybird 浏览器技术解析:独立引擎、多进程架构与构建实战

Ladybird 是一款自称"真正独立"的 Web 浏览器,本文基于仓库根目录的 [README](https://link.gitcode.com/i/508d8cb8b04f51865c9a96c4832195b3) 展开,结合仓库中的构建文档、进程架构文档与源码目录结构,系统讲解它的多进程架构设计、核心库栈组成,以及从零构建并运行浏览器的完整流程。读完本文,你将理解 Ladybird 如何在

gitblog_00098的博客 515

MFC 修改CheckBox的文本颜色方法

设置主题 这一步是必须的,不可省略。 BOOL CMFCApplication1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 设置主题 HWND

Kim的博客 2249

001-基础入门-Web演示源码&资源&工具箱等

小迪安全2023笔记

wushangyu32335的博客 4265

微信的研究

下面是个人研究微信android 4.2版本的一些结果,不一定正确。 1. 微信android使用的是amr编码;iphone未知,估计是aac,转码会在微信服务器上完成。android上使用了speex这个库,估计是为了达到边录边发。在服务器做格式转换确实比客户端方便多了,用ffmpeg就可以搞定了,也是瘦客户端的一种思路,而且可以依此延伸很多扩展业务。 2. 微信android最新

lusonglin121的专栏 1129

基础的pdf病毒木马

基础的pdf病毒木马 环境: 攻击机:Kali 目标操作系统:Windows 10或Windows 7 (关闭防火墙和安全软件) 目标软件:Adobe Reader 8.1.2 msf框架搜索:adobe-pdf 1.打开msfconsole 2.搜索 adobe_pdf模块 3.加载攻击模块并设置payload 4.运行生成pdf 5.将pdf拖入到win10 6.打开msf,加...

小小猪的博客 4624

微信的研究【转http://blog.youkuaiyun.com/chief1985/article/details/7902016】

下面是个人研究微信android 4.2版本的一些结果,不一定正确。 1. 微信android使用的是amr编码;iphone未知,估计是aac,转码会在微信服务器上完成。android上使用了speex这个库,估计是为了达到边录边发。在服务器做格式转换确实比客户端方便多了,用ffmpeg就可以搞定了,也是瘦客户端的一种思路,而且可以依此延伸很多扩展业务。 2. 微信andro...

weixin_30706507的博客 56

MPU6050 加速度计和陀螺仪传感器与 Arduino 的接口

虽然该模型并不能准确代表现实世界中加速度计传感器的构建方式,但它通常有助于理解为什么加速度计的输出信号通常以 ±g 为单位指定,或者为什么加速度计在静止时在 z 轴上的读数为 1g,或者在不同方向上您可以期望得到什么样的加速度计读数。该模块的核心是低功耗、低成本的 6 轴运动跟踪芯片 MPU6050,它将 3 轴陀螺仪、3 轴加速度计和数字运动处理器 (DMP) 集成到一个 4mm x 4mm 的微型芯片中。小时候,科学博览会上的陀螺仪总是让我们感到惊讶,因为它们以奇怪的方式移动,甚至似乎违背了重力。

sxstj的博客 9933

实战解析:在.NET中实现Dify API流式请求与响应的完整方案

本文详细解析了在.NET应用中对接Dify API时实现流式请求与响应的完整方案。针对传统后端“接收完才返回”的痛点,文章提供了基于ASP.NET Core的实战代码,通过配置HttpCompletionOption.ResponseHeadersRead和手动Flush响应流,构建高效的中转管道,确保AI回复能够像ChatGPT一样实时逐字推送到前端,显著提升用户体验。

weixin_29267307的博客 296

推荐开源项目:librsync - 高效的文件差异计算库

推荐开源项目:librsync - 高效的文件差异计算库 1、项目介绍 librsync是一个强大的开源库,它实现了著名的rsync协议的核心算法,用于高效地计算并应用文件之间的差异。这个库的目的是为了让你能够轻松地在各种网络应用程序中集成高效的文件传输功能,而无需两个文件都存在于同一系统上。 该项目提供了一个名为rdiff的工具,它暴露了librsync的关键操作:生成文件签名、从签名到新文件生...

gitblog_00069的博客 634

三臂杆大型液压机械臂集中式ADRC控制系统设计

本文设计了一种用于三臂杆液压机械臂的集中式自抗扰控制(ADRC)系统。该系统通过建立包含惯性矩阵、科氏力、重力及摩擦力的非线性动力学模型,并集成液压系统传递函数,构建了完整的系统模型。控制方案采用跟踪微分器安排过渡过程,扩张状态观测器实时估计系统状态和总扰动,以及非线性状态误差反馈生成控制量。MATLAB实现展示了集中式ADRC控制器的核心结构,包括参数定义、跟踪微分器、扩张状态观测器和非线性反馈模块的设计。该系统能有效处理多关节耦合效应,实现三输入三输出的MIMO控制,具有抗干扰能力强、响应速度快的特点。

huanghm88的专栏 271

开源项目librsync快速指南与问题解答

开源项目librsync快速指南与问题解答 librsync是一款强大的远程差异压缩库,采用C语言编写。它实现了rsync协议的核心算法,适用于高效计算文件间的差异,无需两份文件在同一系统上即可完成差异传输。此库广泛应用于备份系统、二进制补丁分发及目录同步场景,如Dropbox、rdiff-backup和Duplicity等知名应用都采用了librsync。 新手注意事项与解决方案 1. 编译安装...

gitblog_00335的博客 592

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

librsync 开源项目安装与使用指南

librsync 开源项目安装与使用指南 1. 项目目录结构及介绍 librsync 是一个实现rsync远程差异算法的免费软件库。以下是基于其GitHub仓库的一般性目录结构说明,具体版本可能会有细微差别: COPYING - 许可证文件,说明了该项目遵循LGPL-2.1许可协议。 ChangeLog - 项目变更日志,记录了每次更新的内容。 configure 和 configure.ac ...

gitblog_00150的博客 542

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: 单链表的逆置-C++实现
下一篇: 用gdb调试C与C++程序
雪岢奇
博客等级 码龄17年 310粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值