Files
SLikeNet/Samples/RPC4/RPC4Sample.cpp
2025-11-24 14:19:51 +05:30

154 lines
4.6 KiB
C++

/*
* Original work: Copyright (c) 2014, Oculus VR, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* RakNet License.txt file in the licenses directory of this source tree. An additional grant
* of patent rights can be found in the RakNet Patents.txt file in the same directory.
*
*
* Modified work: Copyright (c) 2016-2017, SLikeSoft UG (haftungsbeschränkt)
*
* This source code was modified by SLikeSoft. Modifications are licensed under the MIT-style
* license found in the license.txt file in the root directory of this source tree.
*/
#include "slikenet/RPC4Plugin.h"
#include "slikenet/peerinterface.h"
#include <stdio.h>
#include "slikenet/Kbhit.h"
#include <string.h>
#include <stdlib.h>
#include <limits> // used for std::numeric_limits
#include "slikenet/sleep.h"
#include "slikenet/BitStream.h"
#include "slikenet/MessageIdentifiers.h"
#include "slikenet/Gets.h"
#include "slikenet/linux_adapter.h"
#include "slikenet/osx_adapter.h"
using namespace SLNet;
RakPeerInterface *rakPeer;
void CFunc1(SLNet::BitStream *bitStream, Packet *packet )
{
// unused parameters
(void)packet;
printf("CFunc1 ");
SLNet::RakString data;
SLNET_VERIFY(bitStream->ReadCompressed(data));
printf("%s\n", data.C_String());
};
void CFunc2(SLNet::BitStream *bitStream, Packet *packet )
{
// unused parameters
(void)packet;
printf("CFunc2 ");
SLNet::RakString data;
SLNET_VERIFY(bitStream->ReadCompressed(data));
printf("%s\n", data.C_String());
};
void CFunc3(SLNet::BitStream *bitStream, SLNet::BitStream *returnData, Packet *packet )
{
// unused parameters
(void)packet;
printf("CFunc3 ");
SLNet::RakString data;
SLNET_VERIFY(bitStream->ReadCompressed(data));
printf("%s\n", data.C_String());
returnData->WriteCompressed("CFunc3 returnData");
};
int main(void)
{
printf("Demonstration of the RPC4 plugin.\n");
printf("Difficulty: Beginner\n\n");
rakPeer= SLNet::RakPeerInterface::GetInstance();
// Holds user data
char ip[64], serverPort[30], clientPort[30];
// Get our input
puts("Enter the port to listen on");
Gets(clientPort,sizeof(clientPort));
if (clientPort[0]==0)
strcpy_s(clientPort, "0");
const int intClientPort = atoi(clientPort);
if ((intClientPort < 0) || (intClientPort > std::numeric_limits<unsigned short>::max())) {
printf("Specified client port %d is outside valid bounds [0, %u]", intClientPort, std::numeric_limits<unsigned short>::max());
return 2;
}
SLNet::SocketDescriptor sd1(static_cast<unsigned short>(intClientPort),0);
rakPeer->Startup(8,&sd1,1);
rakPeer->SetMaximumIncomingConnections(8);
puts("Enter IP to connect to, or enter for none");
Gets(ip, sizeof(ip));
rakPeer->AllowConnectionResponseIPMigration(false);
RPC4 rpc;
rakPeer->AttachPlugin(&rpc);
rpc.RegisterSlot("Event1", CFunc1, 0);
rpc.RegisterSlot("Event1", CFunc2, 0);
rpc.RegisterBlockingFunction("Blocking", CFunc3);
SLNet::Packet *packet;
if (ip[0])
{
puts("Enter the port to connect to");
Gets(serverPort,sizeof(serverPort));
const int intServerPort = atoi(serverPort);
if ((intServerPort < 0) || (intServerPort > std::numeric_limits<unsigned short>::max())) {
printf("Specified server port %d is outside valid bounds [0, %u]", intServerPort, std::numeric_limits<unsigned short>::max());
return 3;
}
rakPeer->Connect(ip, static_cast<unsigned short>(intServerPort), 0, 0);
RakSleep(1000);
for (packet=rakPeer->Receive(); packet; rakPeer->DeallocatePacket(packet), packet=rakPeer->Receive())
;
SLNet::BitStream testBs;
testBs.WriteCompressed("testData");
// rpc.Signal("Event1", &testBs, HIGH_PRIORITY,RELIABLE_ORDERED,0,rakPeer->GetSystemAddressFromIndex(0),false, true);
RakSleep(100);
for (packet=rakPeer->Receive(); packet; rakPeer->DeallocatePacket(packet), rakPeer->Receive())
;
// Needs 2 program instances, because while the call is blocking rakPeer2->Receive() isn't getting called
SLNet::BitStream testBlockingReturn;
rpc.CallBlocking("Blocking", &testBs, HIGH_PRIORITY,RELIABLE_ORDERED,0,rakPeer->GetSystemAddressFromIndex(0),&testBlockingReturn);
SLNet::RakString data;
testBlockingReturn.ReadCompressed(data);
printf("%s\n", data.C_String());
}
else
{
printf("Waiting for connections.\n");
for(;;)
{
RakSleep(100);
for (packet=rakPeer->Receive(); packet; rakPeer->DeallocatePacket(packet), packet=rakPeer->Receive())
;
}
}
rakPeer->Shutdown(100,0);
SLNet::RakPeerInterface::DestroyInstance(rakPeer);
return 1;
}