p2p sdk接口说明
kkp2p sdk是用c语言编写,仅提供了几个简单接口,您只要掌握了这几个简单接口便可以通过kkp2p通信中间件完成业务通信功能。并且这几个接口的参数和使用习惯非常类似于操作系统提供的网络编程系统调用函数,这将极大的降低您的学习成本。
这些接口全都定义在头文件kkp2p_sdk.h中。
1、kkp2p_engine_conf_t说明
typedef struct kkp2p_engine_conf_s { char* login_domain; uint16_t login_port; uint16_t lan_search_port; char disable_upnp; char* log_path; int max_log_size; } kkp2p_engine_conf_t;
如上所示,kkp2p_engine_conf_t是kkp2p sdk的配置文件,在调用kkp2p_engine_init中需要传入,参数不是特别多,表格说明如下
字段名 | 说明 |
login_domain | 云端部署的域名,即p2p_route模块的对外服务的域名。 商用版本仅支持域名。个人版本为调试方便同时支持ip地址。 如果仅使用局域网搜索功能,不部署云端服务,可以配置为NULL |
login_port | 云端部署的端口号,即p2p_route模块的对外服务的端口号 如果仅使用局域网搜索功能,不部署云端服务,可以配置为0 |
lan_search_port | 本地局域网广播端口号。如果需要使用局域网搜索功能,需要配置该端口号。 如果为0,则不能通过局域网搜索方式被搜索到。 |
disable_upnp | 是否禁止upnp功能,0为允许upnp,1为禁止upnp |
log_path | 日志文件所在的路径,如果为NULL,则表示当前程序运行所在的路径。日志文件名为 kkp2p_engine.log。当在移动端运行时候,要保证app对该目录有读写权限。 |
max_log_size | 日志文件最大大小。当日志文件超过该值时,则将日志文件重命名为kkp2p_engine.log.bak,然后重新产生一个新的日志文件kkp2p_engine.log |
2、kkp2p_channel_t说明
typedef struct kkp2p_channel_s { char peer_id[33]; int channel_type; int transmit_mode; int encrypt_data; uint32_t channel_id; int is_ipv6_p2p; int connect_desc; int fd; } kkp2p_channel_t;
如上所示,kkp2p_channel_t用于描述一个连接,也可以理解为一个数据传输通道
字段名 | 说明 |
peer_id | 如果是服务端,表示自己的peer id;如果是客户端,表示对端的peer id,最大长度为32个字节 |
channel_type | 通道类型 0:tcp通道类型,sdk解决udp包丢包、乱序以及流控 1:udp通道类型,sdk不解决udp包丢包、乱序以及流控 2:webrtc通道类型,支持浏览器webrtc观看设备端音视频 |
transmit_mode | 传输模式 1 p2p方式传输 2 中转方式传输 |
encrypt_data | 是否是一个加密的传输通道。 0 对应用层数据没有加解密 1 自动对业务数据进行加密或者解密 |
channel_id | 通道的id,用于关闭一个通道 |
is_ipv6_p2p | 是否使用ipv6进行p2p通信。p2p通信支持使用ipv6 0 没有使用ipv6通信 1 使用ipv6进行p2p传输 |
connect_desc | 用户自定义参数,由客户端建连时候在建连参数里面指定 |
fd | 该通道的代理句柄。应用层通过对该fd进行读写数据就可以和对端通信。 需要注意的是,关闭通道并不会关闭该fd,该fd需要调用接口单独关闭,否则会有fd句柄泄漏。 |
3、kkp2p_connect_cb回掉函数
typedef void(*kkp2p_connect_cb)(int result, kkp2p_channel_t* channel, void* param);
该函数是一个回掉函数,如果应用层创建连接使用的是异步接口,当kkp2p sdk的engine层创建连接结束后,不管创建成功还是创建失败,都会调用该函数通知应用层,该函数由应用层自行实现,并当作参数传入给建连函数。
字段名 | 说明 |
result | 创建连接的结果。 0 成功 <0 失败 |
channel | 连接描述信息。 需要注意的是,应用层必须在该函数中将该channel的信息深度拷贝出来业务层自行保存,因为该函数中的channel是一个临时指针,该函数结束后便会自动释放。 |
param | 应用层自行传入的参数 |
4、kkp2p_create_offer_sdp_cb回掉函数
typedef int (*kkp2p_create_offer_sdp_cb)(const char* peerId ,const void* remoteSdp ,const char* webApi, const char* webParam,void* localSdp);
该函数是一个回掉函数,用于收到浏览器webrtc的sdp信息后,生成本端的sdp信息
字段名 | 说明 |
result | 创建连接的结果。 >=0 成功 <0 失败 |
peerId | 本端的登录账号 |
remoteSdp | 对端的sdp信息 |
webApi | 浏览器访问的url,自定义参数,可为NULL |
webParam | 用户自定义参数,可为NULL |
localSdp | 需要生成的本端的sdp信息 |
5、kkp2p_connect_ctx_t说明
typedef struct kkp2p_connect_ctx_s { char peer_id[33]; int channel_type; int connect_mode; int encrypt_data; int timeout; int connect_desc; kkp2p_connect_cb func; void* func_param; } kkp2p_connect_ctx_t;
如上所示,kkp2p_connect_ctx_t是创建连接相关的参数。在函数kkp2p_connect、kkp2p_lan_search中会用到。
字段名 | 说明 |
peer_id | 对端的peer id,最大长度为32位 |
channel_type | 需要创建的通道类型 0:tcp通道类型,sdk解决udp包丢包、乱序以及流控 1:udp通道类型,sdk不解决udp包丢包、乱序以及流控 2:webrtc通道类型,仅支持从浏览器发起创建。 |
connect_mode | 连接模式 0 自动模式,engine层会先创建一个p2p模式的连接,如果p2p模式失败(网络穿透失败)则连接使用中转模式 1 使用p2p模式,如果网络穿透失败,创建连接会失败,有一定的失败率。 2 使用中转模式,使用中转模式一般会创建连接成功 需要注意的是,如果在函数kkp2p_lan_search中使用,参数必须填1 |
encrypt_data | 是否创建一个加密的连接。加密的密钥是双方通过算法自动协商而成的动态密钥。 0 不加密 1 加密 |
timeout | 创建连接的超时时间,单位为毫秒,由于建连是一个比较复杂过程,该参数建议最好超过1000,即1秒钟 |
connect_desc | 用户自定义的和该连接绑定的参数,该参数会由建连发起方透传给接收方 |
func | 是一个回掉函数,如果func为NULL,则创建连接是一个同步函数;否则创建连接是一个异步函数,engine层创建连接结束后,会调用func函数通知业务层,func函数由业务层自己实现。 |
func_param | 和func层结合起来使用,engine层调用func函数时,会传入func_param参数,该参数一般是一个指针,用于保存业务层自定义的一些信息。 |
6、kkp2p_engine_init
函数声明 | |
kkp2p_engine_t* kkp2p_engine_init(const kkp2p_engine_conf_t* conf, int timeout) | |
函数说明 | |
初始化kkp2p sdk的底层engine | |
返回值 | |
成功则返回一个指向kkp2p_engine_t结构的指针,失败返回NULL | |
参数表 | |
参数 | 说明 |
conf | 配置文件,不能为NULL |
timeout | 超时时间,当配置文件的login_domain为域名时候,为解析域名的超时时间。 如果传入的是域名,engine层会定时解析域名最新对应的ip地址列表;用于支持对云端p2p_route模块进行在线动态扩缩容。 |
7、kkp2p_engine_destroy
函数声明 | |
void kkp2p_engine_destroy(kkp2p_engine_t* engine); | |
函数说明 | |
释放kkp2p sdk的底层engine,当程序退出时候,必须释放kkp2p engine,否则会有内存泄漏。当调用该接口后,所有的连接会停止数据发送,并被立即删除。 | |
返回值 | |
无 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
8、kkp2p_switch_log_level
函数声明 | |
void kkp2p_switch_log_level(kkp2p_engine_t* engine, int level); | |
函数说明 | |
切换日志级别,默认级别为0,即不输出日志 | |
返回值 | |
无 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
level | 日志级别,定义如下: 0 不输出日志 1 error级别,仅输出error日志 2 normal级别,输出2及以下级别日志 3 info级别,输出3及以下级别日志 4 debug级别,输出所有日志 |
9、kkp2p_get_domainip
函数声明 | |
int kkp2p_get_domainip(kkp2p_engine_t* engine, char* szHosts, int ipLen, int ipCount) | |
函数说明 | |
获取kkp2p engine解析出来的ip地址列表,用于判断engine层域名解析的是否符合预期。engine会定时对域名进行解析,所以如果域名对应的ip地址发生了变化,需要再次调用kkp2p_get_domainip才能获取到engine层最新解析出来的域名对应的ip地址。 注意,szHosts指向的字符串数组的内存空间由应用层申请。比如char szHosts[10][16]是一个二维数组,表示总共有10个ip地址,每个ip地址占用16个字节的内存空间。用法参考如下,获取域名对应的最多10个ip地址 char szHosts[10][16]; memset(szHosts, 0, sizeof(szHosts); kkp2p_get_domainip(engine, szHosts, 16, 10); | |
返回值 | |
小于0表示失败,一般是参数非法,比如ipLen参数小于16 大于等于0表示成功,即解析出来的实际ip地址个数,存放于szHosts二维数组中。 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
szHosts | 字符串数组。解析出来的ip地址会放入其中。 |
ipLen | ip地址最大长度,该参数必须大于等于16 |
ipCount | ip地址个数 |
10、kkp2p_join_net
函数声明 | |
int kkp2p_join_net(kkp2p_engine_t* engine, char* peerId, char* secret); | |
函数说明 | |
将peer加入到云端p2p网络。如果peer想作为服务端(peer server)被客户端(peer client)通过云端主动发起建立连接,必须调用该接口。如果仅使用局域网搜索模式可以不掉用该接口。 掉用该接口后,sdk的engine会将该peer登录到云端服务器,如果因为网络原因登录失败,会定时尝试直至成功。 该接口返回成功并不表示登录成功,登录过程由engine层的线程完成。 | |
返回值 | |
小于0表示失败 大于等于0表示成功 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
peerId | peer的id |
secret | peer的密钥,云端会通过签名验证方式对其验证 |
11、kkp2p_join_lan
函数声明 | |
int kkp2p_join_lan(kkp2p_engine_t* engine, char* peerId); | |
函数说明 | |
将peer加入到本地局域网。如果peer想作为服务端(peer server)被客户端(peer client)通过局域网搜索方式主动发起建立连接,必须调用该接口。如果不想使用局域网搜索功能可以不掉用该接口。 | |
返回值 | |
小于0表示失败 大于等于0表示成功 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
peerId | peer的id |
12、kkp2p_listen_fd
函数声明 | |
int kkp2p_listen_fd(kkp2p_engine_t* engine); | |
函数说明 | |
获取engine层侦听连接相关联的fd句柄,该句柄可读时候,表示有连接过来,可以通过调用kkp2p_accept来获取一个新的远程连接。 应用层是否必须掉用该接口,取决于您的编程模型。如果有单独的业务线程来掉用kkp2p_accept接口,可以不需要调用该接口。 | |
返回值 | |
小于等于0表示失败 大于0表示成功 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
13、kkp2p_accept
函数声明 | |
int kkp2p_accept(kkp2p_engine_t* engine,int timeout, kkp2p_channel_t* channel); | |
函数说明 | |
获取一个远程连接 | |
返回值 | |
小于0表示失败 等于0表示超时 大于0表示成功 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
timeout | 超时时间,单位为毫秒 |
channel | 获取到的连接信息 |
14、kkp2p_connect
函数声明 | |
int kkp2p_connect(kkp2p_engine_t* engine, kkp2p_connect_ctx_t* ctx, kkp2p_channel_t* channel); | |
函数说明 | |
通过云端搜索方式,和对端创建一个连接,即创建一个传输通道。 如果ctx参数的func为NULL,该接口是一个同步函数,创建连接结束后返回。 如果ctx参数的func不为NULL,该接口是一个异步函数,会立即返回,engine层在创建连接结束后调用func函数通知业务层,func函数由业务层自定义实现。 | |
返回值 | |
小于0表示失败 大于等于0表示成功 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
ctx | 创建连接相关的参数,详见前面章节kkp2p_connect_ctx_t的描述 |
channel | 获取到的连接信息 |
15、kkp2p_lan_search
函数声明 | |
int kkp2p_lan_search(kkp2p_engine_t* engine, kkp2p_connect_ctx_t* ctx, kkp2p_channel_t* channel); | |
函数说明 | |
通过局域网搜索方式,对端创建一个连接,即创建一个传输通道。 参数含义和kkp2p_connect相同。 需要注意是的,局域网搜索模式时候,ctx的connect_mode字段必须填1,否则会返回参数错误 | |
返回值 | |
小于0表示失败 大于等于0表示成功 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
ctx | 创建连接相关的参数,详见前面章节kkp2p_connect_ctx_t的描述 |
channel | 获取到的连接信息 |
16、kkp2p_read
函数声明 | |
int kkp2p_read(int fd, char* buff, int len, int timeout); | |
函数说明 | |
读取对端发过来的数据。 需要说明的是,fd本身就是一个socket句柄,您也可以通过自己实现的函数或者操作系统提供的函数对其进行读取操作,以支持更大的编程灵活性。 kkp2p_read是kkp2p sdk提供的一个读取实现。 | |
返回值 | |
小于0表示失败,此时应用层应该关闭fd句柄 等于0表示超时 大于0表示实际读到的字节数 | |
参数表 | |
参数 | 说明 |
fd | 连接的代理句柄 |
buff | 数据缓冲区 |
len | 缓冲区的长度 |
timeout | 超时时间,单位毫秒 |
17、kkp2p_write
函数声明 | |
int kkp2p_write(int fd, char* buff, int len, int timeout); | |
函数说明 | |
向对端发送的数据。 需要说明的是,fd本身就是一个socket句柄,您也可以通过自己实现的函数或者操作系统提供的函数对其进行写入操作,以支持更大的编程灵活性。 kkp2p_write是kkp2p sdk提供的一个写入实现。 | |
返回值 | |
小于0表示失败,此时应用层应该关闭fd句柄 等于0表示超时 大于0表示实际写入成功的字节数,对于未写入成功的字节数,应用层应该再次尝试写入未成功的数据。 | |
参数表 | |
参数 | 说明 |
fd | 连接的代理句柄 |
buff | 数据缓冲区 |
len | 缓冲区的长度 |
timeout | 超时时间,单位毫秒 |
18、kkp2p_close_channel
函数声明 | |
void kkp2p_close_channel(kkp2p_engine_t* engine, uint32_t channel); | |
函数说明 | |
关闭连接。应用层调用该接口后,engine层会等到该连接所有的数据都发送出去后在真正删除该连接,不过最多只会等待3分钟。 需要注意的是,关闭连接,并不会关闭该连接的代理fd,该代理fd的关闭,需要通过kkp2p_close_fd另行关闭。 之所以连接的fd由应用层自行管理,是为了更大的编程灵活性。 需要提醒您注意,对于连接的fd句柄,应用层最多只能调用一次关闭接口,否则可能会有一些问题。因为对于有些系统,socket的fd句柄是可以重复使用的,比如某个fd的值被关闭后,重新创建一个新的socket句柄,会复用该值。 | |
返回值 | |
无 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
channel | 传输通道id |
19、kkp2p_close_fd
函数声明 | |
void kkp2p_close_fd(int fd); | |
函数说明 | |
关闭连接对应的代理句柄。之所以连接的fd由应用层自行关闭,是为了更大的编程灵活性。当您读写fd句柄异常时候,需要调用该接口关闭fd句柄。 需要提醒您注意,对于连接的fd句柄,应用层最多只能调用一次关闭接口,否则可能会有一些问题。因为对于有些系统,socket的fd句柄是可以重复使用的,比如某个fd的值被关闭后,重新创建一个新的socket句柄,会复用该值。 | |
返回值 | |
无 | |
参数表 | |
参数 | 说明 |
fd | 连接对应的代理fd句柄 |
20、kkp2p_start_proxy
函数声明 | |
int kkp2p_start_proxy(kkp2p_engine_t* engine, char* ip, uint16_t port, kkp2p_connect_ctx_t* ctx, uint32_t* proxyId); | |
函数说明 | |
该函数会创建一个p2p通信的代理,应用层将数据发送到参数中ip和port后,内部的p2p代理会自动将数据转发到ctx参数里面的账号。支持向外提供tcp地址代理和udp地址的代理。 | |
返回值 | |
>=0 成功 <0 失败 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
ip | 代理的ip地址 |
port | 代理的端口号 |
ctx | 连接参数 |
proxyId | 创建成功后,返回的代理的id |
21、kkp2p_stop_proxy
函数声明 | |
void kkp2p_stop_proxy(kkp2p_engine_t* engine, uint32_t proxyId); | |
函数说明 | |
停止p2p代理服务 | |
返回值 | |
无 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
proxyId | 创建成功后,返回的代理的id |
22、kkp2p_webrtc_set_sdp_cb
函数声明 | |
void kkp2p_webrtc_set_sdp_cb(kkp2p_engine_t* engine, kkp2p_webrtc_create_sdp cb) | |
函数说明 | |
设置回调函数,该回调函数由应用层完成,根据对端的sdp信息,设置好本端的sdp信息 | |
返回值 | |
无 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
cb | 回调函数 |
23、kkp2p_webrtc_set_cert_fingerprint
函数声明 | |
void kkp2p_webrtc_set_cert_fingerprint(kkp2p_engine_t* engine, char* finger, int fingerLen) | |
函数说明 | |
设置本端dtls通信证书的指纹信息 | |
返回值 | |
无 | |
参数表 | |
参数 | 说明 |
engine | 指向kkp2p_engine_t的指针,该指针通过kkp2p_engine_init获取 |
finger | 证书指纹缓冲区地址 |
fingerLen | 证书指纹长度 |