开源网络引擎RakNet分析

RakNet:著名开源网络引擎,用于网络游戏、多人联机游戏。

架构分析:

分为三大模块:network communication, plugins that use network communication, and general game functionality

核心是network communication,分为RakPeerTCPInterface。游戏状态同步用的是RakPeer,基于UDP协议。某些业务如补丁升级用的是TCPInterfaceRakPeer会创建2个线程,一个线程用于阻塞式的recvfrom(),另一个线程用于周期性的发包如保活检测、RTT检测、MTU探测等。收到的包会放到一个线程安全的队列中,用户线程每次主循环都调用RakPeer::Receive()来读取期间所有收到的消息。用户发送给RakPeer的消息,会在一个RakPeer发送周期整合成一个报文。

基本架构如下:

    其实它的核心代码大量的工作都花在了用UDP模拟出一个近似TCP的效果,从功能上来说,只是比TCP增加了几种传输方式:UNRELIABLE,UNRELIABLE_SEQUENCED,RELIABLE,RELIABLE_ORDERED,RELIABLE_SEQUENCED。以发送1,2,3,4,5,6数据为例,各传输方式下接收端收到的包为:

UNRELIABLE - 5, 1, 6

UNRELIABLE_SEQUENCED - 5 (6 was lost in transit, 1,2,3,4 arrived later than 5)

RELIABLE - 5, 1, 4, 6, 2, 3

RELIABLE_ORDERED - 1, 2, 3, 4, 5, 6

RELIABLE_SEQUENCED - 5, 6 (1,2,3,4 arrived later than 5)。

     目的只有一个,就是想去掉TCP的丢包重传机制。用UNRELIABLE_SEQUENCED传输方式,游戏的数据不需要每包都必达从而避免丢包重传,因为新的包代表新的状态,直接用新状态即可,不用非要等旧的包到达。TCP的丢包重传会花费比较多的时间(ping值的1.5倍)造成网络延迟。

    Plugin代码都是在构建在核心代码之上,提供一些网络游戏或多人游戏常用的功能。

 

发现其他玩家方式:输入IP直连,局域网广播搜索然后连接,服务器Room管理连接,或者服务器提供玩家列表用来连接。

互联方式:主要还是用Master/Slave方式实现多机互联。也提供了单独服务器(就是网游的方式)连接的功能,和p2p的功能。但p2p方式其实除了聊天外其他情景没法儿用。单独服务器用来给Console Game互联太浪费也意义不大,并且编程复杂度要高很多。

组队:可以通过它的TeamBalancer plugin来建立队伍。

补丁系统:如果玩家之间版本不一样,可以通过从Master那里下载补丁来达到版本一致,RakNet提供AutopatcherServer and AutopatcherClient pluginsFileListTransfer plugin and the DirectoryDeltaTransfer plugin实现这一功能。

游戏结果成就上传:游戏结束后有类似积分之类的数据需要上传到服务器的,可以用LobbyServer and LobbyClient来实现。需要有单独的服务器并且为每个用户建立一个账号。

聊天:

 

——未完,后续会更新补充。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值