/* * This file was taken from RakNet 4.082. * Please see licenses/RakNet license.txt for the underlying license and related copyright. * * * Modified work: Copyright (c) 2018-2021, 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. */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Threading; using System.Timers; using System.IO; using SLNet; namespace CSharpTestApp { class TestMain { static void Main(string[] args) { if (!File.Exists("SLikeNet.dll")) { Console.WriteLine("The SLikeNet DLL is missing.\nPress enter to quit."); Console.Read(); return; } try { RakString dllCallTest = new RakString(); } catch (Exception) { Console.WriteLine("DLL issue.\nMost likely the provided DLL wasn't build with the C# wrapper file.\nPress enter to quit."); Console.Read(); return; } Packet testPacket; int loopNumber; BitStream stringTestSendBitStream = new BitStream(); BitStream rakStringTestSendBitStream = new BitStream(); BitStream receiveBitStream = new BitStream(); String holdingString; TimeSpan startTimeSpan; RakString rakStringTest = new RakString(); RakPeerInterface testClient = RakPeer.GetInstance(); testClient.Startup(1, new SocketDescriptor(60000, "127.0.0.1"), 1); RakPeerInterface testServer = RakPeer.GetInstance(); testServer.Startup(1, new SocketDescriptor(60001, "127.0.0.1"), 1); testServer.SetMaximumIncomingConnections(1); Console.WriteLine("Send and receive loop using BitStream.\nBitStream read done into RakString"); testClient.Connect("127.0.0.1", 60001, "", 0); String sendString = "The test string"; stringTestSendBitStream.Write((byte)DefaultMessageIDTypes.ID_USER_PACKET_ENUM); stringTestSendBitStream.Write(sendString); RakString testRakString = new RakString("Test RakString"); rakStringTestSendBitStream.Write((byte)DefaultMessageIDTypes.ID_USER_PACKET_ENUM); rakStringTestSendBitStream.Write(testRakString); startTimeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1)); loopNumber = 0; while (startTimeSpan.TotalSeconds + 5 > (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds) { testPacket = testServer.Receive(); if (testPacket != null && testPacket.data[0] == (byte)DefaultMessageIDTypes.ID_USER_PACKET_ENUM) { receiveBitStream.Reset(); receiveBitStream.Write(testPacket.data, testPacket.length); receiveBitStream.IgnoreBytes(1); receiveBitStream.Read(rakStringTest); Console.WriteLine("Loop number: " + loopNumber + "\nData: " + rakStringTest.C_String()); } testServer.DeallocatePacket(testPacket); loopNumber++; System.Threading.Thread.Sleep(50); testClient.Send(rakStringTestSendBitStream, PacketPriority.LOW_PRIORITY, PacketReliability.RELIABLE_ORDERED, (char)0, new AddressOrGUID(new SystemAddress("127.0.0.1", 60001)), false); } Console.WriteLine("String send and receive loop using BitStream.\nBitStream read done into String"); SystemAddress[] remoteSystems; ushort numberOfSystems=1; testServer.GetConnectionList(out remoteSystems, ref numberOfSystems); startTimeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1)); loopNumber = 0; while (startTimeSpan.TotalSeconds + 5 > (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds) { testPacket = testServer.Receive(); if (testPacket != null && testPacket.data[0] == (byte)DefaultMessageIDTypes.ID_USER_PACKET_ENUM) { receiveBitStream.Reset(); receiveBitStream.Write(testPacket.data, testPacket.length); receiveBitStream.IgnoreBytes(1); receiveBitStream.Read(out holdingString); Console.WriteLine("Loop number: " + loopNumber + "\nData: " + holdingString); } testServer.DeallocatePacket(testPacket); loopNumber++; System.Threading.Thread.Sleep(50); SystemAddress sa = SLNet.SLikeNet.UNASSIGNED_SYSTEM_ADDRESS; testClient.Send(stringTestSendBitStream, PacketPriority.LOW_PRIORITY, PacketReliability.RELIABLE_ORDERED, (char)0, new AddressOrGUID(new SystemAddress("127.0.0.1", 60001)), false); } //If RakString is not freed before program exit it will crash rakStringTest.Dispose(); testRakString.Dispose(); RakPeer.DestroyInstance(testClient); RakPeer.DestroyInstance(testServer); Console.WriteLine("Demo complete. Press Enter."); Console.Read(); } } #if AUTOPATCHERMYSQLTESTS private static int TestAutoPatcherClient() { //Stick the restarter path here String restarterPath = "C:\\Rak4\\Samples\\AutopatcherClientRestarter\\Debug\\AutopatcherClientRestarter.exe"; TestCB transferCallback = new TestCB(); Console.Write("A simple client interface for the advanced autopatcher.\n"); Console.Write("Use DirectoryDeltaTransfer for a simpler version of an autopatcher.\n"); Console.Write("Difficulty: Intermediate\n\n"); Console.Write("Client starting..."); SystemAddress serverAddress = RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS; AutopatcherClient autopatcherClient = new AutopatcherClient(); FileListTransfer fileListTransfer = new FileListTransfer(); autopatcherClient.SetFileListTransferPlugin(fileListTransfer); RakPeerInterface rakPeer; rakPeer = RakPeerInterface.GetInstance(); SocketDescriptor socketDescriptor = new SocketDescriptor(0, null); rakPeer.Startup(1, 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); Console.Write("started\n"); String buff; Console.Write("Enter server IP: "); buff = Console.ReadLine(); if (buff == "") buff = "127.0.0.1"; rakPeer.Connect(buff, 60000, null, 0); Console.Write("Connecting...\n"); String appDir; Console.Write("Enter application directory: "); appDir = Console.ReadLine(); if (appDir == "") { appDir = "C:/temp2"; } String appName; Console.Write("Enter application name: "); appName = Console.ReadLine(); if (appName == "") appName = "TestApp"; bool patchImmediately = false; if (!patchImmediately) Console.Write("Hit 'q' to quit, 'p' to patch, 'c' to cancel the patch. 'r' to reconnect. 'd' to disconnect.\n"); else Console.Write("Hit 'q' to quit, 'c' to cancel the patch.\n"); char ch; Packet p; while (true) { p = rakPeer.Receive(); while (p != null) { if (p.data[0] == (byte)DefaultMessageIDTypes.ID_DISCONNECTION_NOTIFICATION) Console.Write("ID_DISCONNECTION_NOTIFICATION\n"); else if (p.data[0] == (byte)DefaultMessageIDTypes.ID_CONNECTION_LOST) Console.Write("ID_CONNECTION_LOST\n"); else if (p.data[0] == (byte)DefaultMessageIDTypes.ID_CONNECTION_REQUEST_ACCEPTED) { Console.Write("ID_CONNECTION_REQUEST_ACCEPTED\n"); serverAddress = p.systemAddress; } else if (p.data[0] == (byte)DefaultMessageIDTypes.ID_CONNECTION_ATTEMPT_FAILED) Console.Write("ID_CONNECTION_ATTEMPT_FAILED\n"); else if (p.data[0] == (byte)DefaultMessageIDTypes.ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR) { //String buff; //BitStream temp = new BitStream(p.data, p.length, false); //temp.IgnoreBits(8); //StringCompressor.Instance().DecodeString(buff, 256, temp); //Console.Write("ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR\n"); //Console.Write("%s\n", buff); } else if (p.data[0] == (byte)DefaultMessageIDTypes.ID_AUTOPATCHER_FINISHED) Console.Write("ID_AUTOPATCHER_FINISHED\n"); else if (p.data[0] == (byte)DefaultMessageIDTypes.ID_AUTOPATCHER_RESTART_APPLICATION) Console.Write("Launch \"AutopatcherClientRestarter.exe autopatcherRestart.txt\"\nQuit this application immediately after to unlock files.\n"); rakPeer.DeallocatePacket(p); p = rakPeer.Receive(); } if (Console.KeyAvailable) ch = Console.ReadKey().KeyChar; else ch = (char)0; if (ch == 'q') break; else if (ch == 'r') { rakPeer.Connect(buff, 60000, null, 0); } else if (ch == 'd') { rakPeer.CloseConnection(serverAddress, true); } else if (ch == 'p' || (serverAddress != RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS && patchImmediately)) { patchImmediately = false; String lastUpdateDate; String restartFile; restartFile = appDir; restartFile += "/autopatcherRestart.txt"; // Console.Write("Enter last update date (only newer updates retrieved) or nothing to get all updates\n"); // lastUpdateDate = Console.ReadLine(); lastUpdateDate = ""; if (autopatcherClient.PatchApplication(appName, appDir, lastUpdateDate, serverAddress, transferCallback, restartFile, restarterPath)) { Console.Write("Patching process starting.\n"); } else { Console.Write("Failed to start patching.\n"); } } else if (ch == 'c') { autopatcherClient.Clear(); Console.Write("Autopatcher cleared.\n"); } Thread.Sleep(30); } // Dereference so the destructor doesn't crash autopatcherClient.SetFileListTransferPlugin(null); rakPeer.Shutdown(500, 0); RakPeerInterface.DestroyInstance(rakPeer); return 1; } private static void TestAutoPatcherServer() { TimeSpan startTimeSpan; // Avoids the Error: Got a packet bigger than 'max_allowed_packet' bytes Console.Write("Important: Requires that you first set the DB schema and the max packet size on the server.\n"); Console.Write("See DependentExtensions/AutopatcherMySQLRepository/readme.txt\n"); Console.Write("Server starting... "); AutopatcherServer autopatcherServer = new AutopatcherServer(); FLP_Printf progressIndicator = new FLP_Printf(); FileListTransfer fileListTransfer = new FileListTransfer(); // So only one thread runs per connection, we create an array of connection objects, and tell the autopatcher server to use one thread per item const int sqlConnectionObjectCount = 4; AutopatcherMySQLRepository[] connectionObject = new AutopatcherMySQLRepository[sqlConnectionObjectCount]; AutopatcherRepositoryInterface[] connectionObjectAddresses = new AutopatcherRepositoryInterface[sqlConnectionObjectCount]; for (int i = 0; i < sqlConnectionObjectCount; i++) { connectionObject[i] = new AutopatcherMySQLRepository(); connectionObjectAddresses[i] = connectionObject[i]; } fileListTransfer.SetCallback(progressIndicator); autopatcherServer.SetFileListTransferPlugin(fileListTransfer); RakPeerInterface rakPeer; rakPeer = RakPeerInterface.GetInstance(); SocketDescriptor socketDescriptor = new SocketDescriptor((ushort)LISTEN_PORT, null); rakPeer.Startup(8, socketDescriptor, 1); rakPeer.SetMaximumIncomingConnections(MAX_INCOMING_CONNECTIONS); rakPeer.AttachPlugin(autopatcherServer); rakPeer.AttachPlugin(fileListTransfer); Console.Write("started.\n"); Console.Write("Enter database password:\n"); String password; String username = "root"; password = Console.ReadLine(); if (password == "") password = "aaaa"; string db; Console.Write("Enter DB schema: "); // To create the schema, go to the command line client and type create schema autopatcher; // You also have to add // max_allowed_packet=128M // Where 128 is the maximum size file in megabytes you'll ever add // to MySQL\MySQL Server 5.1\my.ini in the [mysqld] section // Be sure to restart the service after doing so db = Console.ReadLine(); ; if (db == "") db = "autopatcher"; for (int conIdx = 0; conIdx < sqlConnectionObjectCount; conIdx++) { if (!connectionObject[conIdx].Connect("localhost", username, password, db, 0, null, 0)) { Console.Write("Database connection failed.\n"); return; } } Console.Write("Database connection suceeded.\n"); Console.Write("Starting threads\n"); autopatcherServer.StartThreads(sqlConnectionObjectCount, connectionObjectAddresses); Console.Write("System ready for connections\n"); Console.Write("(D)rop database\n(C)reate database.\n(A)dd application\n(U)pdate revision.\n(R)emove application\n(Q)uit\n"); char ch; Packet p; while (true) { p = rakPeer.Receive(); while (p != null) { if (p.data[0] == (byte)DefaultMessageIDTypes.ID_NEW_INCOMING_CONNECTION) Console.Write("ID_NEW_INCOMING_CONNECTION\n"); else if (p.data[0] == (byte)DefaultMessageIDTypes.ID_DISCONNECTION_NOTIFICATION) Console.Write("ID_DISCONNECTION_NOTIFICATION\n"); else if (p.data[0] == (byte)DefaultMessageIDTypes.ID_CONNECTION_LOST) Console.Write("ID_CONNECTION_LOST\n"); rakPeer.DeallocatePacket(p); p = rakPeer.Receive(); } if (Console.KeyAvailable) { ch = Console.ReadKey().KeyChar; if (ch == 'q') break; else if (ch == 'c') { if (!connectionObject[0].CreateAutopatcherTables()) Console.Write("Error: %s\n", connectionObject[0].GetLastError()); else Console.Write("Created\n"); } else if (ch == 'd') { if (!connectionObject[0].DestroyAutopatcherTables()) Console.Write("Error: %s\n", connectionObject[0].GetLastError()); else Console.Write("Destroyed\n"); } else if (ch == 'a') { Console.Write("Enter application name to add: "); string appName; appName = Console.ReadLine(); ; if (appName == "") appName = "TestApp"; if (!connectionObject[0].AddApplication(appName, username)) Console.Write("Error: %s\n", connectionObject[0].GetLastError()); else Console.Write("Done\n"); } else if (ch == 'r') { Console.Write("Enter application name to remove: "); string appName; appName = Console.ReadLine(); ; if (appName == "") appName = "TestApp"; if (!connectionObject[0].RemoveApplication(appName)) Console.Write("Error: %s\n", connectionObject[0].GetLastError()); else Console.Write("Done\n"); } else if (ch == 'u') { Console.Write("Enter application name: "); string appName; appName = Console.ReadLine(); ; if (appName == "") appName = "TestApp"; Console.Write("Enter application directory: "); string appDir; appDir = Console.ReadLine(); ; if (appDir == "") appDir = "C:/temp"; if (!connectionObject[0].UpdateApplicationFiles(appName, appDir, username, progressIndicator)) { Console.Write("Error: %s\n", connectionObject[0].GetLastError()); } else { Console.Write("Update success.\n"); } } } Thread.Sleep(30); } RakPeerInterface.DestroyInstance(rakPeer); } #endif }