RakNet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务。通常情况下用于游戏,但也可以用于其它项目。
外文名
RakNet
最新版本
4.081适用系统
Windows,Linux,Mac OS
适用平台
IOS,Android,Windows Phone 8
适用引擎
Unity,Unreal engine
目录
RakNet特点
编辑
RakNet有以下特点:
l 高性能 在同一台计算机上,RakNet可以实现在两个程序之间每秒传输25,000条信息;
l 容易使用 RakNet有在线用户手册,视频教程。每一个函数和类都有详细的讲解,每一个功能都有自己的例程;
l 跨平台,当前RakNet支持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示例
编辑
例子:
#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)
{
rakServerInterface->Start(32, 0, 0, 60000);// 服务器运行在端口60000处
/*第一个参数表明你的服务器允许同时连接多少个客户端,这个参数最大可以设置成65535;
第二个参数做保留之用,设置成0;
第三个参数用于设置多久进行服务器更新,参数要大于等于0,表示用每隔当前设置的毫秒数进行更新,这里设置的是0;
最后一个参数用于设置服务器的端口;*/
}
else
{
// 运行客户端
printf("输入服务器IP地址:\n");
gets(str);
if (str[0]==0)
strcpy(str, "127.0.0.1");
rakClientInterface->Connect(str, 60000, 0, 0, 0);
/*第一个参数表示你要连接的服务器的IP地址,如果是在自己这台计算机调试程序,直接输入”127.0.0.1”或“localhost”;
第二个参数表示要连接的服务器的端口;
第三个参数表示要连接的客户端端口,主要就是用于客户端之间交换数据;
第四个参数不要;
第五个参数和服务器start函数中的第三个参数一样.*/
}
while (1)
{
if (rakServerInterface)
packet = rakServerInterface->Receive();
else
packet = rakClientInterface->Receive();
if (packet)
{
switch (packet->data[0])
{
case ID_REMOTE_DISCONNECTION_NOTIFICATION:
printf("另一个连接已经断开.\n");
break;
case ID_REMOTE_CONNECTION_LOST:
printf("一个客户端丢失连接.\n");
break;
case ID_REMOTE_NEW_INCOMING_CONNECTION:
printf("一个客户端已上线.\n");
break;
case ID_CONNECTION_REQUEST_ACCEPTED:
printf("我们的连接要求已经接受.\n");
break;
case ID_NEW_INCOMING_CONNECTION:
printf("有新连接.\n");
break;
case ID_NO_FREE_INCOMING_CONNECTIONS:
printf("服务器已满.\n");
break;
case ID_DISCONNECTION_NOTIFICATION:
if (rakServerInterface)
printf("客户端丢失.\n");
else
printf("连接中断.\n");
break;
case ID_CONNECTION_LOST:
if (rakServerInterface)
printf("客户端丢失连接.\n");
else
printf("连接丢失.\n");
break;
printf("ID信息 %i 已经到达.\n", packet->data[0]);
break;
}
if (rakServerInterface)
rakServerInterface->DeallocatePacket(packet);
else
rakClientInterface->DeallocatePacket(packet);
}
}
// TODO - Add code body here
//getch();
if (rakClientInterface)
RakNetworkFactory::DestroyRakClientInterface(rakClientInterface);
else if (rakServerInterface)
RakNetworkFactory::DestroyRakServerInterface(rakServerInterface);
return 0;
}