#  KKP2P SDK介绍
kkp2p sdk是库快科技(kkuai.com)研发的支持p2p通信的中间件,是一套与业务无关的通用的p2p sdk库, 可以免费下载试用版本使用。
一句话概括其特点:支持面向登录账号进行网络编程。
即只要传入对端的账号id,应用层就能得到一个socket句柄fd,应用层通过读写该socket fd句柄和对端进行通信。

优秀特性 说明
跨平台 kkp2p的sdk库是由c语言开发,在linux、windows、android、ios等平台编译出了静态库,以及其他一些嵌入式平台也编译出了静态库,大家可以直接下载进行使用。云端服务是由golang语言开发,也支持在各种平台下编译出直接可以运行的程序,配置也比较简单,大家下载之后就可以按照官网文档说明自行进行部署。
体积小 kkp2p不依赖于任何第三方库,编译出来的库只有500KB左右大小。
性能强 在服务器上测试,P2P方式通信的速度可以超过10MB每秒;中转方式通信的速度取决于您云端服务器的带宽
易使用 提供了类似于socket编程接口的kkp2p_connect、kkp2p_listen、kkp2p_accept、kkp2p_read、kkp2p_write几个核心函数,使用起来非常简单方便。您只要指定对端的登录账号通过kkp2p_connect函数就能和对端创建一个虚拟的传输管道,然后通过kkp2p_read和kkp2p_write函数来读写数据和对端进行通信。您还可以通过参数指定是使用P2P方式通信还是使用中转(relay)方式通信,完全不用关心底层传输通道的创建和管理细节,一切由kkp2p的sdk库帮您解决。
高安全 支持加密通道传输,您只需要在kkp2p_connect的参数中指定需要加密数据即可。sdk会自动创建一个加密的虚拟通信管道出来;您写入明文,sdk会自动加密成密文传输;sdk收到密文,会自动解密成明文返回给您。通信双方的共同密钥是双方的sdk通过DH算法自动协商而成,外界无法获取;并且每次sdk的启动都会自动协商生成一个新的动态密钥,严格保障您的通信数据的安全。如果您为了提升数据传输的性能,不想对数据进行加解密,只需要在创建连接的函数kkp2p_connect参数中指定不需要加密数据即可。sdk的数据加解密功能只有在商业版本中才有,在个人试用版本中没有该功能。
通用性 kkp2p是一套适用于各种场景的通用的通信中间件,会完全透传用户的数据,您可以灵活的自定义通信双方的协议,kkp2p不会解析您的业务数据。kkp2p的P2P通信是基于udp实现的,kkp2p会自动帮您解决丢包、乱序、重传问题,也会根据您的实际带宽做自适应的带宽流控,您使用起来具有tcp传输的效果,相当于是用udp模拟实现了tcp。中转(relay)通信是基于tcp原生实现的。

#  发送文件客户端

本例子用于举例说明,使用kkp2p sdk如何向对端传输一个文件,本例子是传文件客户端,接收文件服务端请看其他章节。

传文件过程:首先向对端发送4个字节(网络序,例子仅支持4G左右文件大小,如果想支持更大文件,得传输8个字节文件大小,您可以自行修改),然后再传输文件内容;传输完成后,等待对端应答。收到对端应答后,就关闭连接的fd句柄以及关闭连接,最后退出。

通过例子可以看到,p2p sdk向外提供的接口非常简单易用。下面看具体的代码,该代码在linux平台验证测试通过

#  源码讲解

#include <stdio.h>
#include <stdint.h>
#include <errno.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
#include <time.h>// 去kkuai.com获取
// 得包含kkp2p sdk的头文件,以及链接libkkp2p.a
#include "kkp2p_sdk.h"// 简单封装一下发送指定长度数据接口
int SendData(int fd, char* buff, int len) {int sended = 0 ;while (sended < len) {// 1秒超时时间int wl = kkp2p_write(fd, buff + sended, len - sended, 1000);if (wl < 0) {printf("SendData error,fd:%d,ret:%d,len:%d,errno:%d,desc:%s.\n",fd,wl, len, errno, strerror(errno));return -1;}sended += wl;}return len;
}// 简单封装一下读取指定长度数据接口
// 例子主要用该函数接收服务端的返回
int RecvData(int fd, char* buff, int len) {int recved = 0 ;while (recved < len) {// 1秒超时时间int wl = kkp2p_read(fd, buff + recved, len - recved, 1000);if (wl < 0) {printf("RecvData error,fd:%d,ret:%d,len:%d,errno:%d,desc:%s.\n",fd,wl, len,errno, strerror(errno));return -1;}recved += wl;}return len;
}// 例子需要输入两个参数,一个是对端的登录peerId,一个是需要发送文件的路径
int main(int argc, char** argv)
{if (argc < 3) {printf("usage:%s peerId filename.\n",argv[0]);return -1;}// kkp2p sdk的配置信息,包括云端登录信息,局域网搜索端口,以及日志配置kkp2p_engine_conf_t kkp2p_conf;kkp2p_conf.login_domain = "125.72.218.199";kkp2p_conf.login_port = 3080;kkp2p_conf.lan_search_port = 3549;kkp2p_conf.max_log_size = 1024*1024*10;kkp2p_conf.log_path = NULL;kkp2p_engine_t* p2pEngine = kkp2p_engine_init(&kkp2p_conf, 5000);if (p2pEngine == NULL) {printf("init kkp2p engine error.\n");return -1;}// 日志级别切换为debug模式kkp2p_switch_log_level(p2pEngine, 4);char* peerId = argv[1];char* fileName = argv[2];FILE* pRead = fopen(fileName, "rb");if (pRead == NULL) {printf("fopen %s error.\n", fileName);kkp2p_engine_destroy(p2pEngine);return -1;}// 获取文件大小struct stat statInfo;stat(fileName, &statInfo);uint32_t fileSize = statInfo.st_size;// 创建连接,使用自动模式,非加密连接,2秒超时// 自动模式由engince层自动判断是p2p传输还是中转传输kkp2p_connect_ctx_t ctx;memset(&ctx, 0, sizeof(ctx));strncpy(ctx.peer_id, peerId, 32);ctx.connect_mode = 0;ctx.encrypt_data = 0;ctx.timeout = 2000;kkp2p_channel_t channel;int connRet = -1 ;// 一直等待创建连接成功while (connRet != 0) {time_t starT = time(NULL);// 同步建连connRet = kkp2p_connect(p2pEngine, &ctx, &channel);time_t endT = time(NULL);if (connRet != 0 ) {printf("pid:%d connect timeout,cost:%d,try again.\n",getpid(),endT-starT);}}// 建连成功printf("pid %d create new connection success,fd:%d, mode is %d,channel id:%u.\n",getpid(),channel.fd, channel.transmit_mode,channel.channel_id);// 发送四个字节文件大小,网络序,仅支持4G左右大小,如果希望支持更大,得发送8字节大小uint32_t netSize = htonl(fileSize);int ret = SendData(channel.fd, (char*)&netSize, sizeof(netSize));if (ret < 0) {printf("send error,channel id:%u.\n",channel.channel_id);kkp2p_close_fd(channel.fd);kkp2p_close_channel(p2pEngine, channel.channel_id);kkp2p_engine_destroy(p2pEngine);return -1;}// 循环发送文件内容,直至全都发送结束char szBuff[1024];int readLen = fread(szBuff, 1, sizeof(szBuff), pRead);uint32_t totalSend = 0;while (readLen > 0) {// 通过返回的fd句柄向对端发送数据ret = SendData(channel.fd, szBuff, readLen);if (ret < 0) {printf("send error,file size:%u,total send:%u,channel id:%u.\n",fileSize, totalSend, channel.channel_id);kkp2p_close_fd(channel.fd);kkp2p_close_channel(p2pEngine, channel.channel_id);kkp2p_engine_destroy(p2pEngine);return -1;}totalSend += ret;readLen = fread(szBuff, 1, sizeof(szBuff), pRead);}fclose(pRead);// 发送完成后等待对端应答,文件接收端需要接收完毕后需要发送响应char ack;ret = RecvData(channel.fd, &ack, 1);if (ack == '1') {printf("send success,total send len:%u,channel id:%u.\n",totalSend, channel.channel_id);} else {printf("send error,total send len:%u,channel id:%u.\n",totalSend, channel.channel_id);}// 最后关闭连接的代理fd句柄(否则会有句柄泄漏),关闭连接kkp2p_close_fd(channel.fd);kkp2p_close_channel(p2pEngine, channel.channel_id);//释放kkp2p sdk的enginekkp2p_engine_destroy(p2pEngine);return 0;
}

p2p sdk发送文件客户端源码相关推荐

  1. p2p sdk异步建连源码介绍

    KKP2P SDK介绍 kkp2p sdk是库快科技(kkuai.com)研发的支持p2p通信的中间件,是一套与业务无关的通用的p2p sdk库,可以免费下载试用版本使用. 一句话概括其特点:支持面向 ...

  2. WordPress Blog Android客户端源码分析(一)

    一直想找一个大型的Android开源项目进行分析,由于自身和导师课程需要选择了wordpress的Android客户端源码进行学习和解读.源码github官方下载地址:开源项目地址.分析源码的最佳手段 ...

  3. Libcurl的编译_HTTP/HTTPS客户端源码示例

    HTTP/HTTPS客户端源码示例 环境:  zlib-1.2.8  openssl-1.0.1g  curl-7.36 Author:  Kagula LastUpdateDate: 2016-05 ...

  4. 第三季2:ORTP库的源码分析、RTP发送实验的源码分析

    以下内容源于朱有鹏课程,如有侵权,请告知删除. 一.ORTP库源码分析 1.ORTP库概览 (1)库提供一堆功能函数(本身没有main),都在src目录下 (2)库的使用给了案例(有main),在sr ...

  5. grpc-go客户端源码分析

    grpc-go客户端源码分析 代码讲解基于v1.37.0版本. 和grpc-go服务端源码分析一样,我们先看一段示例代码, const (address = "localhost:50051 ...

  6. TeamTalk客户端源码分析七

    TeamTalk客户端源码分析七 一,CBaseSocket类 二,select模型 三,样例分析:登录功能 上篇文章我们分析了network模块中的引用计数,智能锁,异步回调机制以及数据的序列化和反 ...

  7. Java文件操作源码大全

    Java文件操作源码大全 1.创建文件夹 5 2.创建文件 5 3.删除文件 5 4.删除文件夹 6 5.删除一个文件下夹所有的文件夹 7 6.清空文件夹 8 7.读取文件 8 8.写入文件 9 9. ...

  8. mosquitto客户端对象“struct mosquitto *mosq”管理下篇(mosquitto2.0.15客户端源码分析之四)

    文章目录 前言 5 设置网络参数 5.1 客户端连接服务器使用的端口号 `mosq->port` 5.2 指定绑定的网络地址 `mosq->bind_address` 5.3 客户端连接服 ...

  9. zookeeper 客户端_zookeeper进阶-客户端源码详解

    流程图 先看一下客户端源码的流程图 总体流程 总体流程 开启SendThread线程 开启EventThread 总结 下面根据源码讲解,大家整合源码和流程图一起看最好,本篇内容比较多建议收藏起来看. ...

最新文章

  1. 雷军这个程序员!真的牛逼!
  2. java设计模式之装饰器模式
  3. ansible+powershell DSC 可以管理windows server了
  4. 如何让SAP Spartacus的非英语页面正常显示
  5. R 语言 相关入门资料
  6. SpringBoot实战(八):集成Swagger
  7. Spark算子:RDD行动Action操作(2)–take、top、takeOrdered
  8. Maven 用Eclipse创建web项目后报错的解决方式
  9. 堆(基本介绍,代码实现,以及例题)
  10. 叶三《我们唱》-野孩子(眼望着北方)
  11. Ubuntu 开机自动运行命令或程序
  12. Java 使用嵌套 for 循环打印皇冠
  13. 树莓派Python 按键实验
  14. python对txt文件进行处理实战_python数据处理实战
  15. 初创企业适用的邮件群发软件
  16. 集美福利!陈睿当时加入B站的故事分享
  17. 客户端SDK测试是什么?如何测?
  18. 第7章第31节:四图排版:四张图片两两一组并行排列 [PowerPoint精美幻灯片实战教程]
  19. CoaoaChina开发者小测验常识题
  20. Oxygen XML Editor 25.0.X Crack

热门文章

  1. Hello Qt(一)——QT简介
  2. php监控访客_PHP 记录访客的浏览信息方法
  3. 爱因斯坦为什么那么牛,看看大家怎么说?
  4. 定位、相对定位、绝对定位
  5. 麒麟系统开发笔记(一):国产麒麟系统搭建开发环境之虚拟机安装
  6. 安卓手机很快也要普及3D Touch了
  7. element-ui element-plus trap-focus - 分析
  8. 微信小程序(游戏)----拖拽拼图(图片分块和打乱顺序)
  9. 2018-06-27随想
  10. 搜狗输入法输入,字母全是大写且之间有间隔