RakNet學習
載自:http://www.cnblogs.com/ArenAK/news/2008/01/27/1055207.html
關鍵字: RakNet
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 <stdio.h>
#include <conio.h>
#include <string.h>
#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);
// 127.0.0.1 默認
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;
default:
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;
}