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

Posted LC编程开发者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了免费P2P穿透通信 RDT可靠通信模块测试使用相关的知识,希望对你有一定的参考价值。

RDT模块测试

Wkf lib p2p通信库提供了RDT通信模块,提供可靠的数据传输。

RDT模块的资料如下图:

 

这些RDT模块的信息如下:

Test_lib_rdt_client --- 提供RDT客户端的资料

Test_lib_rdt_server --- 提供RDT服务器的资料

在这些目录下,执行 make_app.sh 脚本,就可以自动编译程序,生成对应的可执行程序。下面,分析RDT模块的API应用,如何快速构建一个P2P可靠通信程序。

RDT客户端

在test_lib_rdt_client目录下,提供了test_lib_rdt_client_v1.cpp程序,源码如下:

#include <stdio.h>

#include <unistd.h>

#include <pthread.h>

#include <string.h>

#include <stdlib.h>

#include <time.h>

#include "wkf_lib_p2p.h"

void test_rdtc_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_rdtc_read_write_buf(int id)

{

int ret;

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);

//sleep(5);

#endif

//==================

//==================

if(p2p_rdtc_update_sys(id)){

LOGAPP("update sys err\\n");

break;

}

//==================

//==================

ret = p2p_rdtc_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 p2p len

//send_len = 1328; //max p2p len

send_len = 1327*2 + 3; //max p2p len

buf[0] = 0xAA;

buf[1] = 0xBB;

buf[2] = 0xCC;

buf[send_len-2] = 0xDD;

buf[send_len-1] = test_c++;

ret = p2p_rdtc_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)

{

p2p_rdtc_update_sys(id); //实时更新系统, 避免长期读取数据, 无法及时更新系统;

//==================

//==================

ret = p2p_rdtc_wait_recv_event(id, 0, 1000);

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_rdtc_recv(id, tmp, 4096, offset);

if(ret < 0){

LOGAPP("recv err, ret = %d\\n", ret);

run = 0;

break;

}

if(0 == ret){

#if 0

LOGAPP("read pkg end\\n");

#endif

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_rdtc_print_buf(read_buf, offset);

#endif

}//end while

}//end while

}//end while

LOGAPP("=== === === end rdtc id = %d === === ===\\n", id);

return 0;

}

//===========================================

//===========================================

int main(int argc, char* argv[])

{

int id = -1;

//==================

//初始化 P2P RDTC 库加载;

//==================

if(wkf_lib_rdtc_init()){

LOGAPP("init lib err\\n");

goto out;

}

//==================

//获取一个 P2P RDTC 对象;

//返回该对象的 ID 号;

//==================

id = p2p_rdtc_get_obj();

if(id < 0){

LOGAPP("Not get rdtc obj\\n");

goto out;

}

//==================

//设置 SN 服务器的地址;

//==================

if(p2p_rdtc_add_sn_addr(id, (char*)TEST_SN_IP, 9600))

{

LOGAPP("set sn addr err\\n");

goto out;

}

//==================

//连接 UID;

//==================

if(p2p_rdtc_connect_uid(id, (char*)"ABC_XYZ_00000001", (char*)"admin", (char*)"123456"))

{

LOGAPP("connect uid err\\n");

goto out;

}

//==================

//测试 P2P 通信, 接收/发送数据;

//==================

#if 1

test_rdtc_read_write_buf(id);

#endif

p2p_rdtc_close_obj(id);

out:

//==================

//销毁 P2P RDTC 库加载;

//==================

wkf_lib_rdtc_deinit();

LOGAPP("ok\\n");

return 0;

}

代码的具体框架如下:

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

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

  1. 工作时,调用p2p_rdtc_update_sys()函数,更新系统信息;
  2. 调用p2p_rdtc_wait_send_event()函数,检测是否可以发送数据;
  3. 调用p2p_rdtc_send()函数,发送数据;
  4. 调用p2p_rdtc_wait_recv_event()函数,检测是否有数据可以读取;
  5. 调用p2p_rdtc_recv()函数,接收数据
  6. 调用p2p_rdtc_close_obj()函数,关闭RDTC对象;
  7. 调用wkf_lib_rdtc_deinit()销毁模块资料

所以,通过这几个简单的API函数,就可以构建一个P2P可靠通信程序。

RDT服务器

在test_lib_rdt_server目录下,提供了test_lib_rdt_server_v1.cpp程序,源码如下:

#include <stdio.h>

#include <unistd.h>

#include <pthread.h>

#include <string.h>

#include <stdlib.h>

#include <time.h>

#include "wkf_lib_p2p.h"

//===========================================

//测试的一个 RDTC Session 对象;

//===========================================

struct test_rdtc_session_obj

{

//===================

//RDTS 对象的 ID;

//===================

int id;

//===================

//获取连接的 PC Session 的 ID;

//===================

int pc_session_id;

};

void test_rdts_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

}

//===========================================

//RDTC session 的工作线程;

//===========================================

void* thread_rdtc_session_work(void* arg)

{

struct test_rdtc_session_obj* pobj = (struct test_rdtc_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_rdts_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_rdts_session_update_sys(id, pc_session_id))<

以上是关于免费P2P穿透通信 RDT可靠通信模块测试使用的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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