免费P2P穿透通信 RDT可靠通信模块测试使用
Posted Linux编程学堂
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;
代码的具体框架如下:
- 调用wkf_lib_rdtc_init()函数,初始化RDTC库;
- 调用p2p_rdtc_get_obj()函数,获取一个RDTC对象,返回RDTC对象的索引值;最终,通过这个索引值,引用一个RDTC对象;
- 调用p2p_rdtc_add_sn_addr()函数,设置SN服务器的地址;
- 调用p2p_rdtc_connect_uid()函数,设置连接RDTC服务器的UID信息,以及连接UID需要验证的用户名和密码;
连接UID成功之后,进入工作状态;
- 工作时,调用p2p_rdtc_update_sys()函数,更新系统信息;
- 调用p2p_rdtc_wait_send_event()函数,检测是否可以发送数据;
- 调用p2p_rdtc_send()函数,发送数据;
- 调用p2p_rdtc_wait_recv_event()函数,检测是否有数据可以读取;
- 调用p2p_rdtc_recv()函数,接收数据
- 调用p2p_rdtc_close_obj()函数,关闭RDTC对象;
- 调用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可靠通信模块测试使用的主要内容,如果未能解决你的问题,请参考以下文章