void main(void) { printf("Shows how to connect telnet to read PacketLogger output from RakPeer.\n"); RakPeerInterface *rakPeer = RakNet::RakPeerInterface::GetInstance(); TelnetTransport tt; ConsoleServer consoleServer; LogCommandParser lcp; PacketConsoleLogger pcl; pcl.SetLogCommandParser(&lcp); consoleServer.AddCommandParser(&lcp); consoleServer.SetTransportProvider(&tt, 23); rakPeer->AttachPlugin(&pcl); RakNet::SocketDescriptor sd(0,0); RakNet::StartupResult sr = rakPeer->Startup(32, &sd, 1); (void) sr; RakAssert(sr==RAKNET_STARTED); printf("Use telnet 127.0.0.1 23 to connect from the command window\n"); printf("Use 'Turn Windows features on and off' with 'Telnet Client' if needed.\n"); printf("Once telnet has connected, type 'Logger subscribe'\n"); printf("Press any key in this window once you have done all this.\n"); RakNet::Packet *packet; while (!kbhit()) { consoleServer.Update(); RakSleep(30); } RakNet::ConnectionAttemptResult car = rakPeer->Connect("natpunch.jenkinssoftware.com", 61111, 0, 0); (void) car; while (1) { for (packet=rakPeer->Receive(); packet; rakPeer->DeallocatePacket(packet), packet=rakPeer->Receive()) { } consoleServer.Update(); RakSleep(30); } }
int main(int argc, char **argv) { RakPeerInterface *rakPeer; char str[256]; char ip[32]; unsigned short remotePort, localPort; RakNet::Packet *packet; printf("This project tests sending a burst of messages to a remote system.\n"); printf("Difficulty: Beginner\n\n"); rakPeer = RakNet::RakPeerInterface::GetInstance(); printf("Enter remote IP (enter to not connect): "); Gets(ip, sizeof(ip)); if (ip[0]) { printf("Enter remote port: "); Gets(str, sizeof(str)); if (str[0]==0) strcpy(str, "60000"); remotePort=atoi(str); printf("Enter local port: "); Gets(str, sizeof(str)); if (str[0]==0) strcpy(str, "0"); localPort=atoi(str); RakNet::SocketDescriptor socketDescriptor(localPort,0); rakPeer->Startup(32, &socketDescriptor, 1); printf("Connecting...\n"); rakPeer->Connect(ip, remotePort, 0, 0); } else { printf("Enter local port: "); Gets(str, sizeof(str)); if (str[0]==0) strcpy(str, "60000"); localPort=atoi(str); RakNet::SocketDescriptor socketDescriptor(localPort,0); rakPeer->Startup(32, &socketDescriptor, 1); } rakPeer->SetMaximumIncomingConnections(32); printf("'s' to send. ' ' for statistics. 'q' to quit.\n"); while (1) { if (kbhit()) { char ch=getch(); if (ch=='q') return 1; else if (ch==' ') { RakNetStatistics *rss; char message[2048]; rss=rakPeer->GetStatistics(rakPeer->GetSystemAddressFromIndex(0)); StatisticsToString(rss, message, 2); printf("%s", message); } else if (ch=='s') { char msgSizeStr[128], msgCountStr[128]; uint32_t msgSize, msgCount,index; printf("Enter message size in bytes: "); Gets(msgSizeStr, sizeof(msgSizeStr)); if (msgSizeStr[0]==0) msgSize=4096; else msgSize=atoi(msgSizeStr); printf("Enter times to repeatedly send message: "); Gets(msgCountStr, sizeof(msgCountStr)); if (msgCountStr[0]==0) msgCount=128; else msgCount=atoi(msgCountStr); RakNet::BitStream bitStream; for (index=0; index < msgCount; index++) { bitStream.Reset(); bitStream.Write((MessageID)ID_USER_PACKET_ENUM); bitStream.Write(msgSize); bitStream.Write(index); bitStream.Write(msgCount); bitStream.PadWithZeroToByteLength(msgSize); rakPeer->Send(&bitStream, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_SYSTEM_ADDRESS, true); } printf("Sent\n"); } } for (packet=rakPeer->Receive(); packet; rakPeer->DeallocatePacket(packet), packet=rakPeer->Receive()) { switch(packet->data[0]) { case ID_CONNECTION_REQUEST_ACCEPTED: printf("ID_CONNECTION_REQUEST_ACCEPTED\n"); break; case ID_NEW_INCOMING_CONNECTION: printf("ID_NEW_INCOMING_CONNECTION\n"); break; case ID_NO_FREE_INCOMING_CONNECTIONS: printf("ID_NO_FREE_INCOMING_CONNECTIONS\n"); break; case ID_DISCONNECTION_NOTIFICATION: printf("ID_DISCONNECTION_NOTIFICATION\n"); break; case ID_CONNECTION_LOST: printf("ID_CONNECTION_LOST\n"); break; case ID_CONNECTION_ATTEMPT_FAILED: printf("Connection attempt failed\n"); break; case ID_USER_PACKET_ENUM: { uint32_t msgSize, msgCount, index; RakNet::BitStream bitStream(packet->data, packet->length, false); bitStream.IgnoreBytes(sizeof(MessageID)); bitStream.Read(msgSize); bitStream.Read(index); bitStream.Read(msgCount); printf("%i/%i len=%i", index+1, msgCount, packet->length); if (msgSize > BITS_TO_BYTES(bitStream.GetReadOffset()) && packet->length!=msgSize) printf("UNDERLENGTH!\n"); else printf("\n"); break; } default: printf("Unknown message type %i\n", packet->data[0]); } } RakSleep(30); } rakPeer->Shutdown(100); RakNet::RakPeerInterface::DestroyInstance(rakPeer); return 1; }
int main(void) { char ch; RakPeerInterface *rakPeer; // directoryDeltaTransfer is the main plugin that does the work for this sample. DirectoryDeltaTransfer directoryDeltaTransfer; // The fileListTransfer plugin is used by the DirectoryDeltaTransfer plugin and must also be registered (you could use this yourself too if you wanted, of course). FileListTransfer fileListTransfer; rakPeer = RakNetworkFactory::GetRakPeerInterface(); rakPeer->AttachPlugin(&directoryDeltaTransfer); rakPeer->AttachPlugin(&fileListTransfer); // Get download progress notifications. Handled by the plugin. rakPeer->SetSplitMessageProgressInterval(1); directoryDeltaTransfer.SetFileListTransferPlugin(&fileListTransfer); printf("This sample demonstrates the plugin to incrementally transfer compressed\n"); printf("deltas of directories. In essence, it's a simple autopatcher.\n"); printf("Unlike the full autopatcher, it has no dependencies. It is suitable for\n"); printf("patching from non-dedicated servers at runtime.\n"); printf("Difficulty: Intermediate\n\n"); printf("Enter listen port. Enter for default. If running two instances on the\nsame computer, use 0 for the client.\n"); unsigned short localPort; char str[256]; gets(str); if (str[0]==0) localPort=60000; else localPort=atoi(str); SocketDescriptor socketDescriptor(localPort,0); if (rakPeer->Startup(8,30,&socketDescriptor, 1)==false) { RakNetworkFactory::DestroyRakPeerInterface(rakPeer); printf("RakNet initialize failed. Possibly duplicate port.\n"); return 1; } rakPeer->SetMaximumIncomingConnections(8); printf("Commands:\n"); printf("(S)et application directory.\n"); printf("(A)dd allowed uploads from subdirectory.\n"); printf("(D)ownload from subdirectory.\n"); printf("(C)lear allowed uploads.\n"); printf("C(o)nnect to another system.\n"); printf("(Q)uit.\n"); RakNetTime nextStatTime = RakNet::GetTime() + 1000; Packet *p; while (1) { /* if (//directoryDeltaTransfer.GetNumberOfFilesForUpload()>0 && RakNet::GetTime() > nextStatTime) { // If sending, periodically show connection stats char statData[2048]; RakNetStatistics *statistics = rakPeer->GetStatistics(rakPeer->GetSystemAddressFromIndex(0)); // if (statistics->messagesOnResendQueue>0 || statistics->internalOutputQueueSize>0) if (rakPeer->GetSystemAddressFromIndex(0)!=UNASSIGNED_SYSTEM_ADDRESS) { StatisticsToString(statistics, statData, 2); printf("%s\n", statData); } nextStatTime=RakNet::GetTime()+5000; } */ // Process packets p=rakPeer->Receive(); while (p) { if (p->data[0]==ID_NEW_INCOMING_CONNECTION) printf("ID_NEW_INCOMING_CONNECTION\n"); else if (p->data[0]==ID_CONNECTION_REQUEST_ACCEPTED) printf("ID_CONNECTION_REQUEST_ACCEPTED\n"); else if (p->data[0]==ID_DISCONNECTION_NOTIFICATION) printf("ID_DISCONNECTION_NOTIFICATION\n"); else if (p->data[0]==ID_CONNECTION_LOST) printf("ID_CONNECTION_LOST\n"); rakPeer->DeallocatePacket(p); p=rakPeer->Receive(); } if (kbhit()) { ch=getch(); if (ch=='s') { printf("Enter application directory\n"); gets(str); if (str[0]==0) strcpy(str, "C:/Temp"); directoryDeltaTransfer.SetApplicationDirectory(str); printf("This directory will be prefixed to upload and download subdirectories.\n"); } else if (ch=='a') { printf("Enter uploads subdirectory\n"); gets(str); directoryDeltaTransfer.AddUploadsFromSubdirectory(str); printf("%i files for upload.\n", directoryDeltaTransfer.GetNumberOfFilesForUpload()); } else if (ch=='d') { char subdir[256]; char outputSubdir[256]; printf("Enter remote subdirectory to download from.\n"); printf("This directory may be any uploaded directory, or a subdir therein.\n"); gets(subdir); printf("Enter subdirectory to output to.\n"); gets(outputSubdir); unsigned short setId; setId=directoryDeltaTransfer.DownloadFromSubdirectory(subdir, outputSubdir, true, rakPeer->GetSystemAddressFromIndex(0), &transferCallback, HIGH_PRIORITY, 0, 0); if (setId==(unsigned short)-1) printf("Download failed. Host unreachable.\n"); else printf("Downloading set %i\n", setId); } else if (ch=='c') { directoryDeltaTransfer.ClearUploads(); printf("Uploads cleared.\n"); } else if (ch=='o') { char host[256]; printf("Enter host IP: "); gets(host); if (host[0]==0) strcpy(host, "127.0.0.1"); unsigned short remotePort; printf("Enter host port: "); gets(str); if (str[0]==0) remotePort=60000; else remotePort=atoi(str); rakPeer->Connect(host, remotePort, 0, 0); printf("Connecting.\n"); } else if (ch=='q') { printf("Bye!\n"); rakPeer->Shutdown(1000,0); break; } } // Keeps the threads responsive RakSleep(0); } RakNetworkFactory::DestroyRakPeerInterface(rakPeer); return 0; }
int main(int argc, char **argv) { printf("A simple client interface for the advanced autopatcher.\n"); printf("Use DirectoryDeltaTransfer for a simpler version of an autopatcher.\n"); printf("Difficulty: Intermediate\n\n"); printf("Client starting..."); SystemAddress serverAddress=UNASSIGNED_SYSTEM_ADDRESS; AutopatcherClient autopatcherClient; FileListTransfer fileListTransfer; autopatcherClient.SetFileListTransferPlugin(&fileListTransfer); unsigned short localPort=0; if (argc>=6) { localPort=atoi(argv[5]); } #ifdef USE_TCP PacketizedTCP packetizedTCP; if (packetizedTCP.Start(localPort,1)==false) { printf("Failed to start TCP. Is the port already in use?"); return 1; } packetizedTCP.AttachPlugin(&autopatcherClient); packetizedTCP.AttachPlugin(&fileListTransfer); #else RakPeerInterface *rakPeer; rakPeer = RakNetworkFactory::GetRakPeerInterface(); SocketDescriptor socketDescriptor(localPort,0); rakPeer->Startup(1,0,&socketDescriptor, 1); // Plugin will send us downloading progress notifications if a file is split to fit under the MTU 10 or more times rakPeer->SetSplitMessageProgressInterval(10); rakPeer->AttachPlugin(&autopatcherClient); rakPeer->AttachPlugin(&fileListTransfer); #endif printf("started\n"); char buff[512]; if (argc<2) { printf("Enter server IP: "); gets(buff); if (buff[0]==0) // strcpy(buff, "94.198.81.195"); strcpy(buff, "127.0.0.1"); } else strcpy(buff, argv[1]); #ifdef USE_TCP packetizedTCP.Connect(buff,60000,false); #else rakPeer->Connect(buff, 60000, 0, 0); #endif printf("Connecting...\n"); char appDir[512]; if (argc<3) { printf("Enter application directory: "); gets(appDir); if (appDir[0]==0) { strcpy(appDir, "C:/temp2"); } } else strcpy(appDir, argv[2]); char appName[512]; if (argc<4) { printf("Enter application name: "); gets(appName); if (appName[0]==0) strcpy(appName, "TestApp"); } else strcpy(appName, argv[3]); bool patchImmediately=argc>=5 && argv[4][0]=='1'; if (patchImmediately==false) printf("Hit 'q' to quit, 'p' to patch, 'c' to cancel the patch. 'r' to reconnect. 'd' to disconnect.\n"); else printf("Hit 'q' to quit, 'c' to cancel the patch.\n"); char ch; Packet *p; while (1) { #ifdef USE_TCP SystemAddress notificationAddress; notificationAddress=packetizedTCP.HasCompletedConnectionAttempt(); if (notificationAddress!=UNASSIGNED_SYSTEM_ADDRESS) { printf("ID_CONNECTION_REQUEST_ACCEPTED\n"); serverAddress=notificationAddress; } notificationAddress=packetizedTCP.HasNewIncomingConnection(); if (notificationAddress!=UNASSIGNED_SYSTEM_ADDRESS) printf("ID_NEW_INCOMING_CONNECTION\n"); notificationAddress=packetizedTCP.HasLostConnection(); if (notificationAddress!=UNASSIGNED_SYSTEM_ADDRESS) printf("ID_CONNECTION_LOST\n"); p=packetizedTCP.Receive(); while (p) { if (p->data[0]==ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR) { char buff[256]; RakNet::BitStream temp(p->data, p->length, false); temp.IgnoreBits(8); stringCompressor->DecodeString(buff, 256, &temp); printf("ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR\n"); printf("%s\n", buff); } else if (p->data[0]==ID_AUTOPATCHER_FINISHED) printf("ID_AUTOPATCHER_FINISHED\n"); else if (p->data[0]==ID_AUTOPATCHER_RESTART_APPLICATION) printf("Launch \"AutopatcherClientRestarter.exe autopatcherRestart.txt\"\nQuit this application immediately after to unlock files.\n"); packetizedTCP.DeallocatePacket(p); p=packetizedTCP.Receive(); } #else p=rakPeer->Receive(); while (p) { if (p->data[0]==ID_DISCONNECTION_NOTIFICATION) printf("ID_DISCONNECTION_NOTIFICATION\n"); else if (p->data[0]==ID_CONNECTION_LOST) printf("ID_CONNECTION_LOST\n"); else if (p->data[0]==ID_CONNECTION_REQUEST_ACCEPTED) { printf("ID_CONNECTION_REQUEST_ACCEPTED\n"); serverAddress=p->systemAddress; } else if (p->data[0]==ID_CONNECTION_ATTEMPT_FAILED) printf("ID_CONNECTION_ATTEMPT_FAILED\n"); else if (p->data[0]==ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR) { char buff[256]; RakNet::BitStream temp(p->data, p->length, false); temp.IgnoreBits(8); stringCompressor->DecodeString(buff, 256, &temp); printf("ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR\n"); printf("%s\n", buff); } else if (p->data[0]==ID_AUTOPATCHER_FINISHED) printf("ID_AUTOPATCHER_FINISHED\n"); else if (p->data[0]==ID_AUTOPATCHER_RESTART_APPLICATION) printf("Launch \"AutopatcherClientRestarter.exe autopatcherRestart.txt\"\nQuit this application immediately after to unlock files.\n"); rakPeer->DeallocatePacket(p); p=rakPeer->Receive(); } #endif if (kbhit()) ch=getch(); else ch=0; if (ch=='q') break; else if (ch=='r') { #ifdef USE_TCP packetizedTCP.Connect(buff,60000,false); #else rakPeer->Connect(buff, 60000, 0, 0); #endif } else if (ch=='d') { #ifdef USE_TCP packetizedTCP.CloseConnection(serverAddress); #else rakPeer->CloseConnection(serverAddress, true); #endif } else if (ch=='p' || (serverAddress!=UNASSIGNED_SYSTEM_ADDRESS && patchImmediately==true)) { patchImmediately=false; char lastUpdateDate[128]; char restartFile[512]; strcpy(restartFile, appDir); strcat(restartFile, "/autopatcherRestart.txt"); // printf("Enter last update date (only newer updates retrieved) or nothing to get all updates\n"); // gets(lastUpdateDate); lastUpdateDate[0]=0; if (autopatcherClient.PatchApplication(appName, appDir, lastUpdateDate, serverAddress, &transferCallback, restartFile, argv[0])) { printf("Patching process starting.\n"); } else { printf("Failed to start patching.\n"); } } else if (ch=='c') { autopatcherClient.Clear(); printf("Autopatcher cleared.\n"); } RakSleep(30); } // Dereference so the destructor doesn't crash autopatcherClient.SetFileListTransferPlugin(0); #ifdef USE_TCP packetizedTCP.Stop(); #else rakPeer->Shutdown(500,0); RakNetworkFactory::DestroyRakPeerInterface(rakPeer); #endif return 1; }
int main() { Packet *packet; RakPeerInterface *rakPeer; bool isConnected=false; rakPeer=RakNetworkFactory::GetRakPeerInterface(); char command[512]; printf("This sample demonstrates connecting to the command console.\n"); printf("using the RakNet transport protocol\n"); printf("It's the equivalent of a secure telnet client\n"); printf("See the 'CommandConsoleServer' project.\n"); printf("Difficulty: Intermediate\n\n"); printf("RakNet secure command console.\n"); printf("Commands:\n"); printf("/Connect\n"); printf("/Disconnect\n"); printf("/Quit\n"); printf("Any other command goes to the remote console\n"); while (1) { if (kbhit()) { gets(command); if (stricmp(command, "/quit")==0) { printf("Goodbye.\n"); rakPeer->Shutdown(500, 0); return 0; } else if (stricmp(command, "/disconnect")==0) { if (isConnected) { rakPeer->Shutdown(500, 0); isConnected=false; printf("Disconnecting.\n"); } else { printf("Not currently connected.\n"); } } else if (stricmp(command, "/connect")==0) { if (isConnected) { printf("Disconnect first.\n"); } else { char ip[128]; char remotePort[64]; char password[512]; char localPort[64]; printf("Enter remote IP: "); do { gets(ip); } while(ip[0]==0); printf("Enter remote port: "); do { gets(remotePort); } while(remotePort[0]==0); printf("Enter local port (enter for 0): "); gets(localPort); if (localPort[0]==0) { strcpy(localPort, "0"); } printf("Enter console password (enter for none): "); gets(password); SocketDescriptor socketDescriptor((int) atoi(localPort),0); if (rakPeer->Startup(1, 100, &socketDescriptor, 1)) { int passwordLen; if (password[0]) passwordLen=(int) strlen(password)+1; else passwordLen=0; if (rakPeer->Connect(ip, (int) atoi(remotePort), password, passwordLen)) printf("Connecting...\nNote: if the password is wrong the other system will ignore us.\n"); else { printf("Connect call failed.\n"); rakPeer->Shutdown(0, 0); } } else printf("Initialize call failed.\n"); } } else { if (isConnected) { RakNet::BitStream str; str.Write((unsigned char) ID_TRANSPORT_STRING); str.Write(command, (int) strlen(command)+1); rakPeer->Send(&str, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_SYSTEM_ADDRESS, true); } else { printf("You must be connected to send commands.\n"); } } } packet = rakPeer->Receive(); if (packet) { switch (packet->data[0]) { case ID_DISCONNECTION_NOTIFICATION: printf("The server disconnected us.\n"); isConnected=false; break; case ID_CONNECTION_BANNED: printf("We are banned from this server.\n"); isConnected=false; break; case ID_CONNECTION_ATTEMPT_FAILED: printf("Connection attempt failed.\nThe password was wrong or there is no responsive machine at that IP/port.\n"); isConnected=false; break; case ID_NO_FREE_INCOMING_CONNECTIONS: printf("Server is full.\n"); isConnected=false; break; case ID_CONNECTION_LOST: printf("We lost the connection.\n"); isConnected=false; break; case ID_CONNECTION_REQUEST_ACCEPTED: printf("Connection accepted.\n"); isConnected=true; break; case ID_TRANSPORT_STRING: printf("%s", packet->data+1); break; } rakPeer->DeallocatePacket(packet); } // This sleep keeps RakNet responsive #ifdef _WIN32 Sleep(30); #else usleep(30 * 1000); #endif return 0; } }
//This static method is called when the user wants to host a server void Session::StartHost(void* pVoid){ //A parameter list is given with needed variables ArgumentList* pArgumentList = (ArgumentList*)pVoid; RakPeerInterface *pServer; //Filling my fields from argument list. pServer=pArgumentList->inter; std::string password = pArgumentList->password; int port = pArgumentList->port; RakNet::RPC3* rpc3Inst = pArgumentList->rpc3; //map that keeps track of who is who std::map<RakNet::SystemAddress, std::string> clientCharacterMap; //Register the functions we want to call RPC3 upon RPC3_REGISTER_FUNCTION(rpc3Inst, ReceiveInformation); RPC3_REGISTER_FUNCTION(rpc3Inst, UpdateCharacter); RPC3_REGISTER_FUNCTION(rpc3Inst, UpdateCharacterVelocity); RPC3_REGISTER_FUNCTION(rpc3Inst, SyncClients); RPC3_REGISTER_FUNCTION(rpc3Inst, ReceiveID); RPC3_REGISTER_FUNCTION(rpc3Inst, RemoveCharacter); RPC3_REGISTER_FUNCTION(rpc3Inst, AddScore); //Set up the host using RakNet pServer->SetIncomingPassword(password.c_str(), (int)strlen(password.c_str())); pServer->SetTimeoutTime(5000,UNASSIGNED_SYSTEM_ADDRESS); SystemAddress clientID=UNASSIGNED_SYSTEM_ADDRESS; RakNet::SocketDescriptor socketDescriptor(port,0); socketDescriptor.socketFamily=AF_INET; bool b = pServer->Startup(10,&socketDescriptor, 1 ); pServer->SetMaximumIncomingConnections(10); pServer->SetOccasionalPing(true); pServer->SetUnreliableTimeout(1000); DataStructures::List<RakNetSmartPtr<RakNetSocket> > sockets; pServer->GetSockets(sockets); // Holds packets Packet* p; // Record the first client that connects to us so we can pass it to the ping function clientID=UNASSIGNED_SYSTEM_ADDRESS; pServer->AttachPlugin(rpc3Inst); char message[2048]; // Loop for input while (threading) { for (p=pServer->Receive(); p; pServer->DeallocatePacket(p), p=pServer->Receive()) { switch (p->data[0]) { case ID_DISCONNECTION_NOTIFICATION: { printf("ID_DISCONNECTION_NOTIFICATION\n"); RakString name(clientCharacterMap[p->systemAddress].c_str()); RemoveCharacter(name); rpc3Inst->CallC("RemoveCharacter", name); break; } case ID_ALREADY_CONNECTED: printf("ID_ALREADY_CONNECTED\n"); break; case ID_CONNECTION_ATTEMPT_FAILED: printf("Connection attempt failed\n"); break; case ID_NO_FREE_INCOMING_CONNECTIONS: printf("ID_NO_FREE_INCOMING_CONNECTIONS\n"); break; case ID_UNCONNECTED_PONG: // Found the server pServer->Connect(p->systemAddress.ToString(false),p->systemAddress.GetPort(),0,0,0); break; case ID_CONNECTION_REQUEST_ACCEPTED: // This tells the client they have connected printf("ID_CONNECTION_REQUEST_ACCEPTED\n"); //Session::SendInformation(RakNet::RakString("The italians are invading utrecht!"), rpc3Inst, 0); //Game::getSingletonPtr()-> break; case ID_NEW_INCOMING_CONNECTION: { //When there is a new incoming connection we are change the local player to the host printf("New incoming connection\n"); Game::getSingletonPtr()->getLocalPlayer()->SetNetworkName("PlayerHost"); std::stringstream ss, ss2; ss << "Client" << (Game::getSingletonPtr()->GetCharacters().size()+1); //create a new character for the client Game::getSingletonPtr()->CreateCharacter(ss.str()); clientCharacterMap[p->systemAddress] = ss.str(); RPC3::CallExplicitParameters params; params.systemAddress = p->systemAddress; params.broadcast = false; //Make sure the client knows who he is rpc3Inst->CallExplicit("ReceiveID", ¶ms, RakString::RakString(ss.str().c_str())); ss2 << Game::getSingletonPtr()->GetCharacters().size(); //Synchronize the players with all clients; make sure they have all the characters on the screen RPC3::CallExplicitParameters params2; //params2.systemAddress = p->systemAddress; params2.broadcast = true; rpc3Inst->CallExplicit("SyncClients", ¶ms2, RakNet::RakString(ss2.str().c_str())); //rpc3Inst->CallC("SyncClients", RakNet::RakString(ss2.str().c_str())); break; } case ID_RPC_REMOTE_ERROR: { // Recipient system returned an error switch (p->data[1]) { case RakNet::RPC_ERROR_NETWORK_ID_MANAGER_UNAVAILABLE: printf("RPC_ERROR_NETWORK_ID_MANAGER_UNAVAILABLE\n"); break; case RakNet::RPC_ERROR_OBJECT_DOES_NOT_EXIST: printf("RPC_ERROR_OBJECT_DOES_NOT_EXIST\n"); break; case RakNet::RPC_ERROR_FUNCTION_INDEX_OUT_OF_RANGE: printf("RPC_ERROR_FUNCTION_INDEX_OUT_OF_RANGE\n"); break; case RakNet::RPC_ERROR_FUNCTION_NOT_REGISTERED: printf("RPC_ERROR_FUNCTION_NOT_REGISTERED\n"); break; case RakNet::RPC_ERROR_FUNCTION_NO_LONGER_REGISTERED: printf("RPC_ERROR_FUNCTION_NO_LONGER_REGISTERED\n"); break; case RakNet::RPC_ERROR_CALLING_CPP_AS_C: printf("RPC_ERROR_CALLING_CPP_AS_C\n"); break; case RakNet::RPC_ERROR_CALLING_C_AS_CPP: printf("RPC_ERROR_CALLING_C_AS_CPP\n"); break; } printf("Function: %s", p->data+2); } } } } pServer->Shutdown(30,0); RakNet::RakPeerInterface::DestroyInstance(pServer); delete rpc3Inst; }