免费P2P穿透通信 P2P模块测试使用
Posted Linux编程学堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了免费P2P穿透通信 P2P模块测试使用相关的知识,希望对你有一定的参考价值。
P2P模块测试
Wkf lib p2p通信库提供了P2P通信模块,该P2P模块使用UDP通信,提供可靠的数据传输。
如果想做数据可靠传输,可以使用RDT模块。
P2P模块的资料如下图:
这些P2P模块的信息如下:
Test_lib_pc --- 提供P2P客户端的资料
Test_lib_ps --- 提供P2P服务器的资料
在这些目录下,执行 make_app.sh 脚本,就可以自动编译程序,生成对应的可执行程序。下面,分析P2P模块的API应用,如何快速构建一个P2P程序。
P2P客户端
在test_lib_pc目录下,提供了test_lib_pc_v1.cpp程序,源码如下:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include "wkf_lib_p2p.h"
void test_pc_print_buf(unsigned char *pbuf, int len)
int i;
if(len >= 6)
LOGAPP("%.2X %.2X %.2X %.2X %.2X %.2X \\n",
pbuf[0],pbuf[1],pbuf[2],
pbuf[len-3],pbuf[len-2],pbuf[len-1]);
return;
for(i = 0; i < len; i++)
LOGAPP("%.2X\\n", pbuf[i]);
//end for
//===========================================
//===========================================
int test_read_write_buf(int id)
int ret, i;
char buf[4096] = 0;
unsigned char read_buf[4096];
char tmp[4096];
int send_len;
int run = 1;
int offset;
unsigned char test_c = 0;
//==================
//==================
while(run)
//==================
//==================
#if 0
sleep(1);
//sleep(8);
#endif
//==================
//==================
if(p2p_pc_update_sys(id))
LOGAPP("update sys err\\n");
break;
//==================
//==================
ret = p2p_pc_wait_send_event(id, 0, 1000);
if(ret < 0)
LOGAPP("wait send err\\n");
break;
if(0 == ret)
//允许发送;
send_len = 5;
//send_len = 1327; //max paylaod len
//send_len = 1328;
//send_len = 1327*2+3;
buf[0] = 0xAA;
buf[1] = 0xBB;
buf[2] = 0xCC;
buf[send_len-2] = 0xDD;
buf[send_len-1] = test_c++;
ret = p2p_pc_send(id, buf, send_len);
if(ret < 0)
LOGAPP("send err, ret = %d\\n", ret);
break;
if(ret != send_len)
LOGAPP("send err, %d != %d\\n", ret, send_len);
break;
//==================
//==================
while(1)
//更新系统状态, 避免进入长时间while循环, 无法更新系统状态;
p2p_pc_update_sys(id);
ret = p2p_pc_wait_recv_event(id, 0, 1000*1000*300);
if(ret < 0)
LOGAPP("wait read err\\n");
run = 0;
break;
if(0 == ret)
//not get pkg
break;
//==================
//开始读取数据, 偏移量从 0 开始;
//==================
offset = 0;
//==================
//有数据可以读取;
//==================
while(run)
ret = p2p_pc_recv(id, tmp, 4096, offset);
if(ret < 0)
LOGAPP("recv err, ret = %d\\n", ret);
run = 0;
break;
if(0 == ret)
LOGAPP("read pkg end\\n");
break;
//==================
//把读取到 tmp[] 缓存中的数据, 拷贝到最终缓存;
//==================
memcpy(&read_buf[offset], tmp, ret);
//==================
//累加已经读取的字节数;
//==================
offset += ret;
//==================
//==================
#if 1
LOGAPP("read pkg ret = %d, have read len = %d\\n", ret, offset);
test_pc_print_buf(read_buf, offset);
#endif
//end while
//end while
//end while
LOGAPP("=== === === end pc id = %d === === ===\\n", id);
return 0;
//===========================================
//===========================================
int main(int argc, char* argv[])
int id = -1;
//==================
//初始化 P2P PC 库加载;
//==================
if(wkf_lib_pc_init())
LOGAPP("init lib err\\n");
goto out;
//==================
//获取一个 P2P PC 对象;
//返回该对象的 ID 号;
//==================
id = p2p_pc_get_obj();
if(id < 0)
LOGAPP("Not get pc obj\\n");
goto out;
//==================
//设置 SN 服务器的地址;
//==================
if(p2p_pc_add_sn_addr(id, (char*)TEST_SN_IP, 9600))
LOGAPP("set sn addr err\\n");
goto out;
//==================
//连接 UID;
//==================
if(p2p_pc_connect_uid(id, (char*)"ABC_XYZ_00000001", (char*)"admin", (char*)"123456"))
LOGAPP("connect uid err\\n");
goto out;
//==================
//测试 P2P 通信, 接收/发送数据;
//==================
#if 1
test_read_write_buf(id);
#endif
p2p_pc_close_obj(id);
out:
//==================
//销毁 P2P PC 库加载;
//==================
wkf_lib_pc_deinit();
LOGAPP("ok\\n");
return 0;
代码的具体框架如下:
- 调用wkf_lib_pc_init()函数,初始化PC库;
- 调用p2p_pc_get_obj()函数,获取一个PC对象,返回PC对象的索引值;最终,通过这个索引值,引用一个PC对象;
- 调用p2p_pc_add_sn_addr()函数,设置SN服务器的地址;
- 调用p2p_pc_connect_uid()函数,设置连接P2P服务器的UID信息,以及连接UID需要验证的用户名和密码;
连接UID成功之后,进入工作状态;
- 工作时,调用p2p_pc_update_sys()函数,更新系统信息;
- 调用p2p_pc_wait_send_event()函数,检测是否可以发送数据;
- 调用p2p_pc_send()函数,发送数据;
- 调用p2p_pc_wait_recv_event()函数,检测是否有数据可以读取;
- 调用p2p_pc_recv()函数,接收数据
- 调用p2p_pc_close_obj()函数,关闭PC对象;
- 调用wkf_lib_pc_deinit()销毁模块资料
所以,通过这几个简单的API函数,就可以构建一个P2P程序。
P2P服务器
在test_lib_ps目录下,提供了test_lib_ps_v1.cpp程序,源码如下:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include "wkf_lib_p2p.h"
//===========================================
//测试的一个 PC Session 对象;
//===========================================
struct test_pc_session_obj
//===================
//PS 对象的 ID;
//===================
int id;
//===================
//获取连接的 PC Session 的 ID;
//===================
int pc_session_id;
;
void test_ps_print_buf(unsigned char *pbuf, int len)
int i;
if(len >= 6)
LOGAPP("%.2X %.2X %.2X %.2X %.2X %.2X \\n",
pbuf[0],pbuf[1],pbuf[2],
pbuf[len-3],pbuf[len-2],pbuf[len-1]);
return;
for(i = 0; i < len; i++)
LOGAPP("%.2X\\n", pbuf[i]);
//end for
//===========================================
//pc session 的工作线程;
//===========================================
void* thread_pc_session_work(void* arg)
struct test_pc_session_obj* pobj = (struct test_pc_session_obj*)arg;
int run = 1;
int ret;
char buf[4096] = 0;
unsigned char read_buf[4096];
char tmp[4096];
int send_len;
int offset;
unsigned char test_c = 0;
int id = pobj->id;
int pc_session_id = pobj->pc_session_id;
//====================
//pc session 与 PC 进行 P2P 连接;
//====================
if(p2p_ps_session_start_p2p_con(id, pc_session_id))
LOGAPP("p2p con err, id = %d, pc session id = %d\\n", id, pc_session_id);
goto out;
//====================
//====================
while(run)
//====================
//====================
#if 0
sleep(1);
#endif
while(1)
//====================
//====================
if(p2p_ps_session_update_sys(id, pc_session_id))
LOGAPP("update sys err\\n");
run = 0;
break;
//====================
//接收数据;
//============ 以上是关于免费P2P穿透通信 P2P模块测试使用的主要内容,如果未能解决你的问题,请参考以下文章