在本系列中使用的raknet版本号为3.611
但raknet的RPC,有了它,你只用实现发送一个信息,这样你就有更多的时间集中到游戏上。
1. 将你的数据编码;
2. 然后调用远程系统的一个相应函数来处理它.
下面,我们来具体地讲解RPC函数。
RPC( const char* uniqueID, //我们注册的RPC函数名
const char *data, //我们要发送的数据;
BitSize_t bitLength, //发送的数据的大小
PacketPriority priority, //数据包的安全级别
PacketReliability reliability, //数据包的可靠性
char orderingChannel, //
SystemAddress systemAddress, //接收者ID
bool broadcast, //是否广播
RakNetTime *includedTimestamp, //与时间有关,以后讲解
NetworkID networkID, //如果是静态函数,直接设置成UNASSIGNED_NETWORK_ID,如果是类的成员函数, 必须是NetworkIDObject 的子类 或者是从NetworkIDObject::GetNetworkID返回的对象
RakNet::BitStream *replyFromTarget //如果是零,不阻塞。否则阻塞。
)
下面来看服务端实例(VS2005编译通过):
// RakNetRpcServer.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdafx.h"
#include "Winsock2.h"
#include "Kbhit.h"
#include "stdio.h"
#include "stdlib.h"
#include "RakSleep.h"
#include "RakNetTypes.h"
#include "RakNetworkFactory.h"
#include "RakPeerInterface.h"
#include "MessageIdentifiers.h"
#pragma comment(lib, "WS2_32.lib")
Packet *packet;//网络传输中用于存储数据的一个数据结构
/
/*
Struct Packet
{
PlayerID playerId; //表明了包的出处。每一个连接服务器的客户端都将被分配一个唯一的ID号,用于标识自己。
Unsigned long length; //数据长度
Unsigned long bitsize; //比特大小
Char *data; //包中的数据
}
*/
/
char message[2048];
char message1[300];
RakPeerInterface *rakServerInterface;
void PrintMessage(RPCParameters *rpcParameters)
{
printf("服务端RPC调用 :%s/n",rpcParameters->input);
}
int main(void)
{
rakServerInterface = RakNetworkFactory::GetRakPeerInterface();//初始化一个服务器实例,为它分配内存
SocketDescriptor socketDescriptor;
socketDescriptor.port = 60000;
if (!rakServerInterface->Startup(100, 100, &socketDescriptor, 1))
{
printf("服务器监听失败/n");
goto SERVER_END;
}
printf("服务器创建成功,等待连接……/n");
rakServerInterface->SetMaximumIncomingConnections(100);
rakServerInterface->SetOccasionalPing(true);
REGISTER_STATIC_RPC(rakServerInterface, PrintMessage);
while (1)
{
if(kbhit())
{
gets(message);
rakServerInterface->RPC("PrintMessage",
message,
(strlen(message)+1)*8,
HIGH_PRIORITY,
RELIABLE_ORDERED, 0,UNASSIGNED_SYSTEM_ADDRESS , true, false, UNASSIGNED_NETWORK_ID,0);
}
packet = rakServerInterface->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("%s/n", packet->data);
if(rakServerInterface)
{
sprintf(message,"%s",packet->data);
rakServerInterface->Send(message,
(const int) strlen(message)+1,
HIGH_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_SYSTEM_ADDRESS, true);
}
break;
}
if (rakServerInterface)
rakServerInterface->DeallocatePacket(packet);
}
}
if (rakServerInterface)
RakNetworkFactory::DestroyRakPeerInterface(rakServerInterface);
SERVER_END:
return 0;
}