免费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;

代码的具体框架如下:

  1. 调用wkf_lib_pc_init()函数,初始化PC库;
  2. 调用p2p_pc_get_obj()函数,获取一个PC对象,返回PC对象的索引值;最终,通过这个索引值,引用一个PC对象;
  3. 调用p2p_pc_add_sn_addr()函数,设置SN服务器的地址;
  4. 调用p2p_pc_connect_uid()函数,设置连接P2P服务器的UID信息,以及连接UID需要验证的用户名和密码;

连接UID成功之后,进入工作状态;

  1. 工作时,调用p2p_pc_update_sys()函数,更新系统信息;
  2. 调用p2p_pc_wait_send_event()函数,检测是否可以发送数据;
  3. 调用p2p_pc_send()函数,发送数据;
  4. 调用p2p_pc_wait_recv_event()函数,检测是否有数据可以读取;
  5. 调用p2p_pc_recv()函数,接收数据
  6. 调用p2p_pc_close_obj()函数,关闭PC对象;
  7. 调用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模块测试使用的主要内容,如果未能解决你的问题,请参考以下文章

免费P2P穿透通信 P2P模块测试使用

免费P2P穿透通信 P2P穿透模块使用注意事项

免费P2P穿透通信 P2P穿透模块使用注意事项

免费P2P穿透通信 P2P穿透模块使用注意事项

免费P2P穿透通信 P2P穿透模块使用注意事项

免费P2P穿透通信 Tunnel隧道映射模块测试使用