6. Windows 客户端开发指南

6.1. 概述

  客户端 P2P 实时传输 SDK 库简称为 libt2u。

  libt2u 的主要作用是将远端设备上的端口映射到本地,随后客户端就可以象直接使用 TCP/UDP 协议访问设备(设备IP地址:端口)一样(127.0.0.1:映射端口)访问远端设备。

  虽然我们已经将建立 P2P 通道的时间优化至短短的3秒,但是为了让用户有更好的体验,我们建议,在客户端应用程序开启后,可以先与所有可能需要创建 P2P 连接的设备预先创建好 P2P 通道,从而使之后的交互可以立即进行。保持预先创建好的 P2P 通道只需要消耗极少量的系统资源和带宽。

  在Windows平台下,使用动态链接库(libt2u.dll)方式集成 P2P。

6.2. 开发步骤

6.2.1. 创建项目

  根据自己的需求,创建 MFC 或命令行应用。本例以命令行应用为例。在VS.NET中,选择菜单“文件/新建/项目”,创建一个命令行应用项目。

6.2.2. 将头文件和库文件复制到项目中

  将头文件libt2u.h和库文件libt2u.lib复制到项目文件夹中。

6.2.3. 包含库和头文件路径

  点击菜单“项目/属性”。

  在“配置属性/链接器/输入/附加依赖项”中输入libt2u.libws2_32.lib
  
  如果你不是将libt2u.h复制在项目文件夹中,则需要在”配置属性/C、C++/常规/附加包含目录“中添加libt2u.h文件所在的文件夹名。

  此外,在编译后,需要将libt2u.dll复制到编译得到的可执行文件的同一文件夹下,程序方能正确运行。

6.2.4. 包含头文件

  在主程序中,包含必要的头文件:

#include <winsock2.h>
#include "libt2u.h"

6.2.5. 初始化

  在Windows中,首先要调用 WSAStartup 完成对Winsock服务的初始化,然后再调用 libt2u 的初始化函数:

    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested = MAKEWORD(2, 0);
    WSAStartup(wVersionRequested, &wsaData);

    t2u_init("nat.vveye.net", 8000, NULL);

  
  初始化接口在应用启动时调用一次即可,不需要每次创建P2P通道时都调用。

  参见接口:t2u_init

  初始化后,调用查询状态函数,等待客户端连接上服务器,代码如下:

//循环
for(;;)
{
    int ret = t2u_status(); //查询状态
    if (ret>0) //已连接到服务器
    {
        //TODO:...
    }
    else  //没有连接到服务器,继续等待
        sleep(1);
}

  参见接口:t2u_status

6.2.6. 查询设备是否在线

  在与设备创建 P2P 连接前,可以先查询一下设备是否在线,如果不在线,就没必要进行后面的步骤了,代码如下:

int ret;
//---------------查询设备是否在线-----------------
ret = t2u_query("设备uuid");

  如果返回值是1,表示在线,参见接口:t2u_query

6.2.7. 映射端口

  将设备的端口映射到本地,假如在设备上有一个 web 服务,服务端口是 80,我们将设备上的 80 端口映射到本机的 8080 端口上,代码示例如下:

ret = t2u_add_port("设备uuid", 80, 8080);

  返回值是已映射的端口,在本例中,已经指定了映射到本地的端口号,实时应用中,由于指定端口可能存在已被占用的情况,因此可以将最后一个参数设置为 0,接口函数自动分配一个可用的端口,并在返回值中返回。

  如果设备端的设置有 P2P 密码,需要使用t2u_add_port_v3这个接口。

  参见接口:

6.2.8. 等待映射结果

T2uNetStat stat;
int ret = t2u_port_status(m_local_port, &stat);

  返回 1 时表示映射成功。

  参见接口:t2u_port_status

6.2.9. 映射成功后,使用标准TCP连接流程进行后续工作

  眏射成功后,就可以按标准的TCP连接流程进行后续工作,本例中,已将设备端的 80 端口映射到本地的 8080 端口上,此时打开浏览器,在地址栏中输入:http://127.0.0.1:8080,将打开设备端的 web 页面。

6.2.10. 关闭 P2P 连接

t2u_del_port(port);

  关闭 P2P 通道,所有使用该 P2P 通道的 TCP 连接也会中断。参数 port 是由 t2u_add_port/t2u_add_port_v3 映射的本地端口。

  参见接口:t2u_del_port
  

6.2.11. 退出程序时释放资源

t2u_exit();

  退出时释放资源。

  参见接口:t2u_exit

详细接口函数,请参见:libt2u C语言 API 接口说明

SDK 库及 DEMO 程序,请从这里下载。