This commit is contained in:
2025-11-24 14:19:51 +05:30
commit f5c1412b28
6734 changed files with 1527575 additions and 0 deletions

View File

@ -0,0 +1,348 @@
/*
* 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/peerinterface.h"
#include "slikenet/BitStream.h"
#include <stdlib.h> // For atoi
#include <cstring> // For strlen
#include "slikenet/Rand.h"
#include "slikenet/statistics.h"
#include "slikenet/MessageIdentifiers.h"
#include <stdio.h>
#include "slikenet/Kbhit.h"
#include "slikenet/GetTime.h"
#include "slikenet/assert.h"
#include "slikenet/sleep.h"
#include "slikenet/Gets.h"
#include "slikenet/linux_adapter.h"
#include "slikenet/osx_adapter.h"
using namespace SLNet;
#ifdef _WIN32
#include "slikenet/WindowsIncludes.h" // Sleep64
#else
#include <unistd.h> // usleep
#include <cstdio>
#include "slikenet/Getche.h"
#endif
static const int NUM_CLIENTS=100;
#define SERVER_PORT 1234
#define RANDOM_DATA_SIZE_1 50
unsigned char randomData1[RANDOM_DATA_SIZE_1];
#define RANDOM_DATA_SIZE_2 100
unsigned char randomData2[RANDOM_DATA_SIZE_2];
char *remoteIPAddress=0;
// Connects, sends data over time, disconnects, repeat
class Client
{
public:
Client()
{
peer = SLNet::RakPeerInterface::GetInstance();
}
~Client()
{
SLNet::RakPeerInterface::DestroyInstance(peer);
}
void Startup(void)
{
SLNet::SocketDescriptor socketDescriptor;
socketDescriptor.port=0;
nextSendTime=0;
SLNET_VERIFY(peer->Startup(1, &socketDescriptor, 1) == RAKNET_STARTED);
isConnected=false;
}
void Connect(void)
{
bool b;
b=peer->Connect(remoteIPAddress, (unsigned short) SERVER_PORT, 0, 0, 0)== SLNet::CONNECTION_ATTEMPT_STARTED;
if (b==false)
{
printf("Client connect call failed!\n");
}
}
void Disconnect(void)
{
peer->CloseConnection(peer->GetSystemAddressFromIndex(0),true,0);
isConnected=false;
}
void Update(SLNet::TimeMS curTime)
{
Packet *p = peer->Receive();
while (p)
{
switch (p->data[0])
{
case ID_CONNECTION_REQUEST_ACCEPTED:
printf("ID_CONNECTION_REQUEST_ACCEPTED\n");
isConnected=true;
break;
// print out errors
case ID_CONNECTION_ATTEMPT_FAILED:
printf("Client Error: ID_CONNECTION_ATTEMPT_FAILED\n");
isConnected=false;
break;
case ID_ALREADY_CONNECTED:
printf("Client Error: ID_ALREADY_CONNECTED\n");
break;
case ID_CONNECTION_BANNED:
printf("Client Error: ID_CONNECTION_BANNED\n");
break;
case ID_INVALID_PASSWORD:
printf("Client Error: ID_INVALID_PASSWORD\n");
break;
case ID_INCOMPATIBLE_PROTOCOL_VERSION:
printf("Client Error: ID_INCOMPATIBLE_PROTOCOL_VERSION\n");
break;
case ID_NO_FREE_INCOMING_CONNECTIONS:
printf("Client Error: ID_NO_FREE_INCOMING_CONNECTIONS\n");
isConnected=false;
break;
case ID_DISCONNECTION_NOTIFICATION:
//printf("ID_DISCONNECTION_NOTIFICATION\n");
isConnected=false;
break;
case ID_CONNECTION_LOST:
printf("Client Error: ID_CONNECTION_LOST\n");
isConnected=false;
break;
}
peer->DeallocatePacket(p);
p = peer->Receive();
}
if (curTime>nextSendTime && isConnected)
{
if (randomMT()%10==0)
{
peer->Send((const char*)&randomData2,RANDOM_DATA_SIZE_2,HIGH_PRIORITY,RELIABLE_ORDERED,0, SLNet::UNASSIGNED_SYSTEM_ADDRESS,true);
}
else
{
peer->Send((const char*)&randomData1,RANDOM_DATA_SIZE_1,HIGH_PRIORITY,RELIABLE_ORDERED,0, SLNet::UNASSIGNED_SYSTEM_ADDRESS,true);
}
nextSendTime=curTime+50;
}
}
bool isConnected;
RakPeerInterface *peer;
SLNet::TimeMS nextSendTime;
};
// Just listens for ID_USER_PACKET_ENUM and validates its integrity
class Server
{
public:
Server()
{
peer = SLNet::RakPeerInterface::GetInstance();
nextSendTime=0;
}
~Server()
{
SLNet::RakPeerInterface::DestroyInstance(peer);
}
void Start(void)
{
SLNet::SocketDescriptor socketDescriptor;
socketDescriptor.port=(unsigned short) SERVER_PORT;
SLNET_VERIFY(peer->Startup((unsigned short)600, &socketDescriptor, 1) == SLNet::RAKNET_STARTED);
peer->SetMaximumIncomingConnections(600);
}
unsigned ConnectionCount(void) const
{
unsigned short numberOfSystems;
peer->GetConnectionList(0,&numberOfSystems);
return numberOfSystems;
}
void Update(SLNet::TimeMS curTime)
{
Packet *p = peer->Receive();
while (p)
{
switch (p->data[0])
{
case ID_CONNECTION_LOST:
case ID_DISCONNECTION_NOTIFICATION:
case ID_NEW_INCOMING_CONNECTION:
printf("Connections = %i\n", ConnectionCount());
break;
// case ID_USER_PACKET_ENUM:
// {
// peer->Send((const char*) p->data, p->length, HIGH_PRIORITY, RELIABLE_ORDERED, 0, p->guid, true);
// break;
// }
}
peer->DeallocatePacket(p);
p = peer->Receive();
}
if (curTime>nextSendTime)
{
if (randomMT()%10==0)
{
peer->Send((const char*)&randomData2,RANDOM_DATA_SIZE_2,HIGH_PRIORITY,RELIABLE_ORDERED,0, SLNet::UNASSIGNED_SYSTEM_ADDRESS,true);
}
else
{
peer->Send((const char*)&randomData1,RANDOM_DATA_SIZE_1,HIGH_PRIORITY,RELIABLE_ORDERED,0, SLNet::UNASSIGNED_SYSTEM_ADDRESS,true);
}
nextSendTime=curTime+100;
}
}
SLNet::TimeMS nextSendTime;
RakPeerInterface *peer;
};
int main(void)
{
Client clients[NUM_CLIENTS];
Server server;
// int clientIndex;
int mode;
printf("Connects many clients to a single server.\n");
printf("Difficulty: Intermediate\n\n");
printf("Run as (S)erver or (C)lient or (B)oth? ");
int ch = _getche();
static char *defaultRemoteIP="127.0.0.1";
char remoteIP[128];
static char *localIP="127.0.0.1";
if (ch=='s' || ch=='S')
{
mode=0;
}
else if (ch=='c' || ch=='c')
{
mode=1;
remoteIPAddress=remoteIP;
}
else
{
mode=2;
remoteIPAddress=localIP;
}
printf("\n");
if (mode==1 || mode==2)
{
printf("Enter remote IP: ");
Gets(remoteIP, sizeof(remoteIP));
if (remoteIP[0]==0)
{
strcpy_s(remoteIP, defaultRemoteIP);
printf("Using %s\n", defaultRemoteIP);
}
}
randomData1[0]=(unsigned char)ID_USER_PACKET_ENUM;
for (unsigned char i=0; i < RANDOM_DATA_SIZE_1-1; i++)
randomData1[i+1]=i;
randomData2[0]=(unsigned char)ID_USER_PACKET_ENUM;
for (unsigned char i=0; i < RANDOM_DATA_SIZE_2-1; i++)
randomData2[i+1]=i;
if (mode==0 || mode==2)
{
server.Start();
printf("Started server\n");
}
if (mode==1 || mode==2)
{
printf("Starting clients...\n");
for (unsigned int i=0; i < NUM_CLIENTS; i++)
clients[i].Startup();
printf("Started clients\n");
printf("Connecting clients...\n");
for (unsigned int i=0; i < NUM_CLIENTS; i++)
clients[i].Connect();
printf("Done.\n");
}
SLNet::TimeMS endTime = SLNet::GetTimeMS()+60000*5;
SLNet::TimeMS time = SLNet::GetTimeMS();
while (time < endTime)
{
if (mode==0 || mode==2)
server.Update(time);
if (mode==1 || mode==2)
{
for (unsigned int i=0; i < NUM_CLIENTS; i++)
clients[i].Update(time);
}
if (_kbhit())
{
ch = _getch();
if (ch==' ')
{
FILE *fp;
char text[2048];
if (mode==0 || mode==2)
{
printf("Logging server statistics to ServerStats.txt\n");
fopen_s(&fp,"ServerStats.txt","wt");
for (unsigned int i=0; i < NUM_CLIENTS; i++)
{
RakNetStatistics *rssSender;
rssSender=server.peer->GetStatistics(server.peer->GetSystemAddressFromIndex(i));
StatisticsToString(rssSender, text, 2048, 3);
fprintf(fp,"==== System %i ====\n", i+1);
fprintf(fp,"%s\n\n", text);
}
fclose(fp);
}
if (mode==1 || mode==2)
{
printf("Logging client statistics to ClientStats.txt\n");
fopen_s(&fp,"ClientStats.txt","wt");
for (unsigned int i=0; i < NUM_CLIENTS; i++)
{
RakNetStatistics *rssSender;
rssSender=clients[i].peer->GetStatistics(clients[i].peer->GetSystemAddressFromIndex(0));
StatisticsToString(rssSender, text, 2048, 3);
fprintf(fp,"==== Client %i ====\n", i+1);
fprintf(fp,"%s\n\n", text);
}
fclose(fp);
}
}
if (ch=='q' || ch==0)
break;
}
time = SLNet::GetTimeMS();
RakSleep(30);
}
if (mode==0 || mode==2)
server.peer->Shutdown(0);
if (mode==1 || mode==2)
for (unsigned int i=0; i < NUM_CLIENTS; i++)
clients[i].peer->Shutdown(0);
printf("Test completed");
return 0;
}