RakNet实用介绍

RakNet是一款面向游戏基于UDP的高性能网络库,注意它开源但并非完全免费。

主页 http://www.jenkinssoftware.com/

 有一些商业化介绍,通过导航可以找到入门指导(RakNet Manual)、Doxygen文档、论坛

论坛支持 http://www.jenkinssoftware.com/forum/

 它的好处在于作者会不定时来扫贴免费答疑解惑,当然你必须用英语,还必须让他看懂。有一段时间我是发现他每天定时会来一次。现在去看好像没那么频繁了。RakNet的免费授权中是说了论坛支持的,更多的支持就要付费授权。你的使用上了一定规模也要付费授权。

下载 http://www.jenkinssoftware.com/raknet/downloads/

 正常的下载需要填写个邮箱,然后下载地址邮给你。有了上面的链接,你就可以直接下载。

TheBasics http://www.jenkinssoftware.com/raknet/manual/index.html

 RakNet开始的第一步,也是为数不过的几步,创建RakPeerInterface:

RakPeerInterface* rakpeer = RakPeerInterface::GetInstance();

 设置绑定的地址到SocketDescriptor

  SocketDescriptor sd;
  strcpy(sd.hostAddress,address); //一定是ip地址,空字符串等同INADDR_ANY 
  sd.port = port;

 启动,设置最大连接数和绑定地址数.可以多地址多端口哦.

  mRakPeer->Startup(maxmumConnections,&sd,addressCount);  //其中addressCount是1

 下面是连接,连接支持域名,ip,不过域名会使用gethostbyname有可能阻塞.

  connRet = mRakPeer->Connect(target,port,CONN_PASSWORD,CONN_PASSWORDLENGTH);

 连接是异步的,那么连接结果以及被连接方是如何工作的呢?使用Receive

  packet = mRakPeerHelper->Receive();

 需要由线程或者主线程不断去调用这个这个函数拾取网络包.packet是RakNet定义的结构,里面有消息的地址,guid,长度等.在data中则包含了此次的数据主体. 数据主体的第一个字节是此次数据的类型,预定义的类型都是通知和反馈型,数据包类型有待开发者自己确定.

switch(packet->data[0])  //注意,没有写break,值只是其中一小部分
{
 case ID_USER_PACKET_SPECIFIC:   //用户定义
 case ID_ADVERTISE_SYSTEM:  //局域广播
 case ID_CONNECTION_LOST:  //连接丢失
 case ID_ALREADY_CONNECTED: //目标已经连接
 case ID_CONNECTION_REQUEST_ACCEPTED: //连接成功,这是发起方
 case ID_NEW_INCOMING_CONNECTION: //新的进来了,这是被动方
 case ID_CONNECTION_ATTEMPT_FAILED: //连接尝试失败,即连接失败
 case ID_INVALID_PASSWORD: //连接失败,密码不匹配
 case ID_INCOMPATIBLE_PROTOCOL_VERSION: //连接失败,RakNet版本不兼容
}

 如果连接成功,连接方得到ID_CONNECTION_REQUEST_ACCEPTED,被连接方得到ID_NEW_INCOMING_CONNECTION,他们就可以互通数据了. 数据的定义要确保预留首字节作为类型.由于RakNet已经使用了一部分,开发者的数据类型需要大于ID_USER_PACKET_ENUM
 发送函数除了指定包和长度,还指定了包优先级,包可靠类型,包通道,目标id,是否全发标志.

mRakPeer->Send((char*)packet,DataLenInPack,(PacketPriority)priority,(PacketReliability)packStyle,orderingChannel,guid,boardcast))
  • 包优先级:在一定的时间内,高优先级包总是比低优先级包更多(2倍)的发出去.
  • 包可靠类型:RakNet虽然基于UDP,但是可以提供TCP一样的可靠传输机制,还可以提供更多独特的不可靠机制,根据需求决定一种以使网络性能最大化.
  • 包通道:在可靠机制下,包是存在顺序的.包通道则是隔离这种影响,让他们像是不同程序一样互不干扰的收发.
  • 全发标志:发送给所有已经连接了的目标,并非局域广播..

收包和前面处理连接反馈一样, switch(packet->data[0])来筛选数据类型,得到数据内容.

 连接双方都可以随时断开连接

mRakPeer->CloseConnection(pi->guid,true,orderingChannel,LOW_PRIORITY);

 断开本质上是发送了断开消息给对方,根据需求可能需要考虑紧迫性问题,以及通道问题,所以关闭函数提供了这样的参数.如果关闭信息顺利到达对方处,对方会得到ID_DISCONNECTION_NOTIFICATION通知,否则的话,对方会在超时到来时得到通知ID_CONNECTION_LOST.
 销毁RakPeerInterface:

RakPeerInterface::DestroyInstance(iface);

 实际使用RakNet过程中,遇到了一些小不方便的地方,还有一些进阶使用,在我的XNetEngine封装中有所体现.具体的请转到XNetEngine—对RakNet的封装和使用.

其他

 在基本网络框架的基础上,RakNet做了很多的插件,他们以一个链的形式,优先处理和过滤收到的信息,以实现扩展的内容.例如Fully Connected Mesh 2实现所有节点的两两互连;NAT punchthrough实现内网的打孔直连等等,你可以在RakNet Manual中一一查看.
 RakNet是一个跨平台库,虽然只是个网络引擎,但是他里面有很完整的数据结构类,例如list,map,queue,hash等等,有一次精心研究了一下他的DS_MemoryPool发现算法非常精妙. 除了这些,你还能从里面学到一些插件的架构和实现方法,单例声明,HTTP连接,Email发送,压缩,流IO等等等等,所有这些都是跨平台的.足够啃老半天的.
 RakNet还做了一些功能拓展(位于源码目录/DependentExtensions),实际也是引入了其他一些第三方库,它就像一个小金矿,一方面你可以直接使用它,一方面可以打开源码,自己掌握它,它扩展了你的眼界. 例如miniupnpc是一个协调路由开放端口映射的库;speedx是个小巧精悍的语音编解码库,让你开发语音对话更容易;Swig这个就牛了,通过编写一些辅助声明(RakNet作者已经搞定),它可以把RakNet代码自动转成C#代码,编出一个C#可以用的RakNet模块.实际使用过程中发现模板类的类型是需要在声明文件里指明的,如果你用了奇葩的类型给到模板类,可能作者并没有帮你声明.于是你可能需要改声明哦.想要完全搞定它,你可能还得了解一下Swig这个神奇的物体.

Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。   Radnet有以下特点:   l 高性能 在同一台计算机上,Raknet可以实现在两个程序之间每秒传输25,000条信息;   l 容易使用 Radnet有在线用户手册,视频教程。每一个函数和类都有详细的讲解,每一个功能都有自己的例程;   l 跨平台,当前Radnet支持Windows, Linux, Macs,可以建立在Visual Studio, GCC, Code: Blocks, DevCPP 和其它平台上;   l 在线技术支持 RakNet有一个活跃的论坛,邮件列表,你只要给他们发信,他们可以在几小时之内回复你。   l 安全的传输 RakNet在你的代码中自动使用SHA1, AES128, SYN,用RSA避免传输受到攻击   l 音频传输 用Speex编码解码,8位的音频只需要每秒500字节传输。   l 远程终端 用RakNet,你能远程管理你的程序,包括程序的设置,密码的管理和日志的管理。   l 目录服务器 目录服务器允许服务器列举他们自己需要的客户端,并与他们连接。   l Autopatcher Autopatcher系统将限制客户端传输到服务端的文件,这样是为了避免一些不合法的用户将一些不合法的文件传输到服务端。   l 对象重载系统   l 网络数据压缩 BitStream类允许压缩矢量,矩阵,四元数和在-1到1之间的实数。   l 远程功能调用   l 强健的通信层 可以保障信息按照不同的信道传输   RakNet支持两种版权,如果你是做免费游戏,RakNet将是免费的。相反,你必须支付一定的费用。   从这里你可以下载到最新的RakNet:   http://www.rakkarsoft.com/raknet/downloads/RakNet.zip   例子:   #include   #include   #include   #include "RakClientInterface.h" //建立客服端所需要的信息,其中包括客服端的建立,连接和数据的发送和接收   #include "RakNetworkFactory.h" //用于管理我们在程序中使用的类,包括类内存分配和类内存的释放   #include "RakServerInterface.h" //用于建立服务器所需用的信息,包括服务器的建立,连接和数据的发送和接收   #include "PacketEnumerations.h" //用于处理网络引擎在运行过程中得到的信息   Packet *packet;//网络传输中用于存储数据的一个数据结构   /////////////////////////////////////////////////////   /*   Struct Packet   {   PlayerID playerId; //表明了包的出处。每一个连接服务器的客户端都将被分配一个唯一的ID号,用于标识自己。   Unsigned long length; //数据长度   Unsigned long bitsize; //比特大小   Char *data; //包中的数据   }   */   /////////////////////////////////////////////////////   int main(void)   {   char str[512];   RakClientInterface *rakClientInterface;   RakServerInterface *rakServerInterface;   printf("(C)客服端 (S)服务器?\n");   gets(str);   if (str[0]=='c')   {   rakClientInterface=RakNetworkFactory::GetRakClientInterface();//初始化一个客户端实例,为它分配内存   rakServerInterface=0;   printf("客服端已经建立。");   }   else   {   rakClientInterface=0;   rakServerInterface=RakNetworkFactory::GetRakServerInterface();//初始化一个服务器实例,为它分配内存   printf("服务器已经建立。");   }   if (rakServerInterface)   {  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值