void MyFunction(RPCParameters *rpcParameters) {}
// 客户端指针
RakClient *rakClient;
//注册成为RPC
REGISTER_AS_REMOTE_PROCEDURE_CALL(rakClient, MyFunction);
C++静态函数
static void MyClass::MyFunction(RPCParameters *rpcParameters) {}
// 客户端指针
RakClient *rakClient;
//注册成为RPC
REGISTER_AS_REMOTE_PROCEDURE_CALL(rakClient, MyClass::MyFunction);
C++ 成员函数
class MyClass : public NetworkIDGenerator {
void __cdecl func1(RPCParameters *rpcParms);
};
//客户端指针
RakClient *rakClient;
//注册成为RPC
REGISTER_CLASS_MEMBER_RPC(rakClient, MyClass, func1) 服务器的注册同上一样。 B.给你的数据编码 你的RPC方法能够处理一个有长度的字符串或比特流,这就等同于将数据打包。 C.调用RPC函数进行处理 D.在远程系统上相应的函数将对你的数据进行处理 以上就是RPC的处理过程。 下面,我们来看一下RPC的参数和结构: char * input; 来自于远程系统的数据; unsigned int numberOfBitsOfData; 我们接收的数据的大小; PlayerID sender; 哪一个系统调用这个RPC; RakPeerInterface * recipient; rakpeer中的哪一个实例将得到这次调用; Bool hasTimestamp; 如果为真,那么输入的开始4个字节表示时间; RakNet::BitStream * replyToSender 用相应的数据流回应发送者. 下面,我们来具体地看一下代码: char message1[300]; void PrintMessage(RPCParameters *rpcParameters) { printf("%sn",rpcParameters->input); sprintf(message1,"%s",rpcParameters->input); if(rakServerInterface) { rakServerInterface->RPC("PrintMessage", message1, (strlen(message1)+1)*8, HIGH_PRIORITY, RELIABLE_ORDERED, 0,rpcParameters->sender, true, false, UNASSIGNED_NETWORK_ID,0); } } 下面,我们来具体地讲解这个函数。 Message1用于存储得到的信息。首先,我们打印我们得到的信息,然后判断我们是否是服务器,如果是,那么就调用客户端的RPC. 这里这个RPC函数原型如下: bool RakServer::RPC ( char * uniqueID, const char * data, unsigned int bitLength, PacketPriority priority, PacketReliability reliability, char orderingChannel, PlayerID playerId, bool broadcast, bool shiftTimestamp, ObjectID objectID, RakNet::BitStream * replyFromTarget ) [virtual, inherited] 第一个参数,我们注册的RPC函数名; 第二个参数,我们要发送的数据; 第三个参数,发送的数据的大小; 第四个参数,数据包的安全级别,和send函数一样; 第五个参数,数据包的可靠性,和send函数一样; 第六个参数,和send函数一样; 第七个参数,接收者ID; 第八个参数,是否广播; 第九个参数,与时间有关,以后讲解; 第十个参数,如果是静态函数,直接设置成UNASSIGNED_OBJECT_ID 第十一个参数,保留。 if (rakServerInterface) { // 服务器运行在端口60000处 rakServerInterface->Start(32, 0, 0, 60000); REGISTER_STATIC_RPC(rakServerInterface, PrintMessage); } else { // 运行客户端 printf("输入服务器IP地址:n"); gets(str); // 127.0.0.1 designates the feedback loop so we can test on one computer if (str[0]==0) strcpy(str, "127.0.0.1"); rakClientInterface->Connect(str, 60000, 0, 0, 0); REGISTER_STATIC_RPC(rakClientInterface, PrintMessage); } 在服务器或客户端注册RPC。 gets(message); if(rakServerInterface) { rakServerInterface->RPC("PrintMessage", message, (strlen(message)+1)*8, HIGH_PRIORITY, RELIABLE_ORDERED, 0,UNASSIGNED_PLAYER_ID , true, false, UNASSIGNED_NETWORK_ID,0); } else { rakClientInterface->RPC("PrintMessage", message, (strlen(message)+1)*8, HIGH_PRIORITY, RELIABLE_ORDERED, 0, false, UNASSIGNED_NETWORK_ID,0); } 得到信息,然后调用RPC。 其它代码不用改动,程序运行的效果如下:
图注1 |
图注2 |