forked from mirror/openmw-tes3mp
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
7.2 KiB
C++
187 lines
7.2 KiB
C++
//
|
|
// Created by koncord on 21.04.17.
|
|
//
|
|
|
|
#include <RakPeerInterface.h>
|
|
#include <RakSleep.h>
|
|
#include <BitStream.h>
|
|
#include <iostream>
|
|
#include <Kbhit.h>
|
|
#include <Gets.h>
|
|
#include <components/openmw-mp/Master/MasterData.hpp>
|
|
#include <components/openmw-mp/Master/PacketMasterAnnounce.hpp>
|
|
#include <components/openmw-mp/Master/PacketMasterUpdate.hpp>
|
|
#include <components/openmw-mp/Master/PacketMasterQuery.hpp>
|
|
#include <components/openmw-mp/NetworkMessages.hpp>
|
|
|
|
using namespace std;
|
|
using namespace RakNet;
|
|
using namespace mwmp;
|
|
|
|
int main()
|
|
{
|
|
cout << "Server test" << endl;
|
|
|
|
SystemAddress masterAddr("127.0.0.1", 25560);
|
|
|
|
RakPeerInterface *peer = RakNet::RakPeerInterface::GetInstance();
|
|
|
|
RakNet::SocketDescriptor sd(25565, 0);
|
|
peer->Startup(8, &sd, 1);
|
|
|
|
ConnectionAttemptResult result = peer->Connect(masterAddr.ToString(false), masterAddr.GetPort(), "pass",
|
|
(int)(strlen("pass")), 0, 0, 5, 500);
|
|
|
|
assert(result == RakNet::CONNECTION_ATTEMPT_STARTED);
|
|
|
|
char message[2048];
|
|
BitStream send;
|
|
|
|
PacketMasterQuery pmq(peer);
|
|
pmq.SetSendStream(&send);
|
|
|
|
PacketMasterAnnounce pma(peer);
|
|
pma.SetSendStream(&send);
|
|
|
|
while (true)
|
|
{
|
|
RakSleep(30);
|
|
|
|
if (kbhit())
|
|
{
|
|
Gets(message, sizeof(message));
|
|
|
|
if (strcmp(message, "quit") == 0)
|
|
{
|
|
puts("Quitting.");
|
|
break;
|
|
}
|
|
else if (strcmp(message, "send") == 0)
|
|
{
|
|
puts("Sending data about server");
|
|
QueryData server;
|
|
server.SetName("Super Server");
|
|
server.SetPlayers(0);
|
|
server.SetMaxPlayers(0);
|
|
|
|
pma.SetServer(&server);
|
|
pma.SetFunc(PacketMasterAnnounce::FUNCTION_ANNOUNCE);
|
|
pma.Send(masterAddr);
|
|
}
|
|
else if (strcmp(message, "get") == 0)
|
|
{
|
|
puts("Request query info");
|
|
send.Reset();
|
|
send.Write((unsigned char) (ID_MASTER_QUERY));
|
|
peer->Send(&send, HIGH_PRIORITY, RELIABLE_ORDERED, CHANNEL_MASTER, masterAddr, false);
|
|
}
|
|
else if (strcmp(message, "getme") == 0)
|
|
{
|
|
send.Reset();
|
|
send.Write((unsigned char) (ID_MASTER_UPDATE));
|
|
send.Write(SystemAddress("127.0.0.1", 25565));
|
|
peer->Send(&send, HIGH_PRIORITY, RELIABLE_ORDERED, CHANNEL_MASTER, masterAddr, false);
|
|
}
|
|
else if (strcmp(message, "status") == 0)
|
|
{
|
|
cout << (peer->GetConnectionState(masterAddr) == IS_CONNECTED ? "Connected" : "Not connected") << endl;
|
|
}
|
|
else if (strcmp(message, "keep") == 0)
|
|
{
|
|
cout << "Sending keep alive" << endl;
|
|
pma.SetFunc(PacketMasterAnnounce::FUNCTION_KEEP);
|
|
pma.Send(masterAddr);
|
|
}
|
|
}
|
|
|
|
for (RakNet::Packet *packet = peer->Receive(); packet; peer->DeallocatePacket(packet), packet = peer->Receive())
|
|
{
|
|
BitStream data(packet->data, packet->length, false);
|
|
unsigned char packetID;
|
|
data.Read(packetID);
|
|
switch (packetID)
|
|
{
|
|
case ID_DISCONNECTION_NOTIFICATION:
|
|
// Connection lost normally
|
|
printf("ID_DISCONNECTION_NOTIFICATION\n");
|
|
break;
|
|
case ID_ALREADY_CONNECTED:
|
|
// Connection lost normally
|
|
printf("ID_ALREADY_CONNECTED with guid %lu\n", packet->guid.g);
|
|
break;
|
|
case ID_INCOMPATIBLE_PROTOCOL_VERSION:
|
|
printf("ID_INCOMPATIBLE_PROTOCOL_VERSION\n");
|
|
break;
|
|
case ID_REMOTE_DISCONNECTION_NOTIFICATION: // Server telling the clients of another client disconnecting gracefully. You can manually broadcast this in a peer to peer enviroment if you want.
|
|
printf("ID_REMOTE_DISCONNECTION_NOTIFICATION\n");
|
|
break;
|
|
case ID_REMOTE_CONNECTION_LOST: // Server telling the clients of another client disconnecting forcefully. You can manually broadcast this in a peer to peer enviroment if you want.
|
|
printf("ID_REMOTE_CONNECTION_LOST\n");
|
|
break;
|
|
case ID_REMOTE_NEW_INCOMING_CONNECTION: // Server telling the clients of another client connecting. You can manually broadcast this in a peer to peer enviroment if you want.
|
|
printf("ID_REMOTE_NEW_INCOMING_CONNECTION\n");
|
|
break;
|
|
case ID_CONNECTION_BANNED: // Banned from this server
|
|
printf("We are banned from this server.\n");
|
|
break;
|
|
case ID_CONNECTION_ATTEMPT_FAILED:
|
|
printf("Connection attempt failed\n");
|
|
break;
|
|
case ID_NO_FREE_INCOMING_CONNECTIONS:
|
|
// Sorry, the server is full. I don't do anything here but
|
|
// A real app should tell the user
|
|
printf("ID_NO_FREE_INCOMING_CONNECTIONS\n");
|
|
break;
|
|
|
|
case ID_INVALID_PASSWORD:
|
|
printf("ID_INVALID_PASSWORD\n");
|
|
break;
|
|
|
|
case ID_CONNECTION_LOST:
|
|
// Couldn't deliver a reliable packet - i.e. the other system was abnormally
|
|
// terminated
|
|
printf("ID_CONNECTION_LOST\n");
|
|
return 0;
|
|
break;
|
|
|
|
case ID_CONNECTION_REQUEST_ACCEPTED:
|
|
// This tells the client they have connected
|
|
printf("ID_CONNECTION_REQUEST_ACCEPTED to %s with GUID %s\n", packet->systemAddress.ToString(true),
|
|
packet->guid.ToString());
|
|
printf("My external address is %s\n", peer->GetExternalID(packet->systemAddress).ToString(true));
|
|
break;
|
|
case ID_MASTER_QUERY:
|
|
{
|
|
map<SystemAddress, QueryData> servers;
|
|
|
|
pmq.SetReadStream(&data);
|
|
pmq.SetServers(&servers);
|
|
pmq.Read();
|
|
|
|
cout << "Received query data about " << servers.size() << " servers" << endl;
|
|
|
|
for (auto serv : servers)
|
|
cout << serv.second.GetName() << endl;
|
|
|
|
break;
|
|
}
|
|
case ID_MASTER_UPDATE:
|
|
{
|
|
pair<SystemAddress, QueryData> serverPair;
|
|
PacketMasterUpdate pmu(peer);
|
|
pmu.SetReadStream(&data);
|
|
pmu.SetServer(&serverPair);
|
|
pmu.Read();
|
|
cout << "Received info about " << serverPair.first.ToString() << endl;
|
|
cout << serverPair.second.GetName() << endl;
|
|
break;
|
|
}
|
|
default:
|
|
cout << "Wrong packet" << endl;
|
|
}
|
|
}
|
|
}
|
|
peer->Shutdown(1000);
|
|
RakPeerInterface::DestroyInstance(peer);
|
|
}
|