internal static void Update() { int counter = 0; ServerMessages msgType; Packet packet; // Receive packets while ((packet = clientInterface.Receive()) != null) { try { receivedBytes += packet.length; packetReader.Load(packet.data, (int)packet.length); msgType = (ServerMessages)packetReader.ReadByte(); ReadMessage(msgType, packetReader); counter++; if (counter >= 1000) { counter = 0; Logger.Log("1000 Pakete hintereinander"); } } catch (Exception e) { if (packet.length >= 1) { Logger.LogError("{0}: {1}: {2}\n{3}", (ServerMessages)packet.data[0], e.Source, e.Message, e.StackTrace); } else { Logger.LogError("{0}: {1}\n{2}", e.Source, e.Message, e.StackTrace); } } finally { clientInterface.DeallocatePacket(packet); } } #region Debug Info // update only every second if (infoTimer.IsReady) { int ping = clientInterface.GetLastPing(clientInterface.GetSystemAddressFromIndex(0)); if (isDisconnected) { abortInfo.Texts[0].Text = "Verbindung geschlossen!"; abortInfo.Show(); } else if (isConnected) { if (ping > 300 || ping < 0) { abortInfo.Show(); } else { abortInfo.Hide(); } } // update ping text on screen int devIndex = 0; GUCVisualText pingText = devInfo.Texts[devIndex++]; pingText.Text = string.Format("Ping: {0}ms", ping); ColorRGBA color; if (ping <= 120) { color = new ColorRGBA((byte)(40 + 180 * ping / 120), 220, 40); } else if (ping <= 220) { color = new ColorRGBA(220, (byte)(220 - 180 * (ping - 100) / 120), 40); } else { color = new ColorRGBA(220, 40, 40); } pingText.SetColor(color); long fps = Hooks.hGame.LastElapsedTicks > 0 ? TimeSpan.TicksPerSecond / Hooks.hGame.LastElapsedTicks : 999; GUCVisualText fpsText = devInfo.Texts[devIndex++]; fpsText.Text = "FPS: " + fps; if (fps < 10) { color = new ColorRGBA(220, 40, 40); } else if (fps < 40) { color = new ColorRGBA(220, (byte)(40 + 180 * (fps - 10) / 30), 40); } else if (fps < 90) { color = new ColorRGBA((byte)(220 - 180 * (fps - 40) / 50), 220, 40); } else { color = new ColorRGBA(40, 220, 40); } fpsText.SetColor(color); devInfo.Texts[devIndex++].Text = "Spike: " + Hooks.hGame.SpikeLongest / TimeSpan.TicksPerMillisecond + "ms"; // update kB/s text on screen int kbs = (int)(receivedBytes); devInfo.Texts[devIndex++].Text = ("Net received: " + kbs + "B/s"); kbs = (int)(sentBytes); devInfo.Texts[devIndex++].Text = ("Net Sent: " + kbs + "B/s"); receivedBytes = 0; sentBytes = 0; if (World.Current != null) { devIndex = 8; devInfo.Texts[devIndex++].Text = World.Current.VobCount + " Vobs"; devInfo.Texts[devIndex++].Text = Client.guidedIDs.Count + " guided"; devInfo.Texts[devIndex++].Text = "Weather: " + World.Current.WeatherCtrl.CurrentWeight + " " + World.Current.Clock.Time.ToString(false); devInfo.Texts[devIndex++].Text = "Barrier: " + World.Current.BarrierCtrl.CurrentWeight + " " + World.Current.BarrierCtrl.EndWeight; devInfo.Texts[devIndex++].Text = "VobSounds: " + SoundHandler.VobSoundCount; devInfo.Texts[devIndex++].Text = "PosSounds: " + SoundHandler.PosSoundCount; //if (NPC.Hero != null) // devInfo.Texts[devIndex++].Text = NPC.Hero.Movement.ToString(); } } #endregion }
public void Disconnect() { client.CloseConnection(client.GetSystemAddressFromIndex(0), true, 0); isConnected = false; }
static int Main(string[] args) { char ch; string userInput; rakPeer = RakNetworkFactory.GetRakPeerInterface(); rakPeer.AttachPlugin(replicaManager); rakPeer.SetNetworkIDManager(networkIDManager); replicaManager.SetAutoParticipateNewConnections(true); replicaManager.SetAutoConstructToNewParticipants(true); replicaManager.SetAutoSerializeInScope(true); replicaManager.SetReceiveConstructionCB(IntPtr.Zero, ConstructionCB); replicaManager.SetDownloadCompleteCB(IntPtr.Zero, SendDownloadCompleteCB, IntPtr.Zero, ReceiveDownloadCompleteCB); StringTable.Instance().AddString("Player", true); StringTable.Instance().AddString("Monster", true); Console.Write("Demonstration of ReplicaManager for client / server\n"); Console.Write("The replica manager provides a framework to make it easier to synchronize\n"); Console.Write("object creation, destruction, and member object updates\n"); Console.Write("Difficulty: Intermediate\n\n"); Console.Write("Run as (s)erver or (c)lient? "); userInput = Console.ReadLine(); if (userInput[0] == 's' || userInput[0] == 'S') { isServer = true; SocketDescriptor socketDescriptor = new SocketDescriptor(60000, string.Empty); rakPeer.Startup(8, 0, new SocketDescriptor[] { socketDescriptor }, 1); rakPeer.SetMaximumIncomingConnections(8); Console.Write("Server started.\n"); } else { isServer = false; SocketDescriptor socketDescriptor = new SocketDescriptor(); rakPeer.Startup(1, 0, new SocketDescriptor[] { socketDescriptor }, 1); Console.Write("Enter IP to connect to: "); userInput = Console.ReadLine(); if (userInput.Equals(string.Empty)) { userInput = "127.0.0.1"; Console.Write("{0}\n", userInput); } if (!rakPeer.Connect(userInput, 60000, string.Empty, 0)) { Console.Write("Connect call failed!\n"); return 1; } Console.Write("Connecting...\n"); } // The network ID manager will automatically index pointers of object instance NetworkIDObject if // SetIsNetworkIDAuthority is called with true. Otherwise, it will rely on another system setting the IDs networkIDManager.SetIsNetworkIDAuthority(isServer); Console.Write("Commands:\n(Q)uit\n(Space) Show status\n(R)andomize health and position\n"); if (isServer) { Console.Write("Toggle (M)onster\nToggle (p)layer\n"); Console.Write("Toggle (S)cope of player\n"); } Packet p; while (true) { p = rakPeer.Receive(); while (p != null) { byte[] data = p.data; // The access to data member had better reduce it. Copying occurs by this. if (data[0] == RakNetBindings.ID_DISCONNECTION_NOTIFICATION || data[0] == RakNetBindings.ID_CONNECTION_LOST) { if (isServer) { Console.Write("Server connection lost. Deleting objects\n"); if (monster != null) { monster.Dispose(); } if (player != null) { player.Dispose(); } } } rakPeer.DeallocatePacket(p); p = rakPeer.Receive(); } if (_kbhit() != 0) { ch = Console.ReadKey(true).KeyChar; if (ch == 'q' || ch == 'Q') { Console.Write("Quitting.\n"); break; } else if (ch == ' ') ShowStatus(monster, player); else if (ch == 'r' || ch == 'R') { if (player != null) { player.health = (int)RakNetBindings.randomMT(); player.position = (int)RakNetBindings.randomMT(); replicaManager.SignalSerializeNeeded(player.replica, RakNetBindings.UNASSIGNED_SYSTEM_ADDRESS, true); } if (monster != null) { monster.health = (int)RakNetBindings.randomMT(); monster.position = (int)RakNetBindings.randomMT(); replicaManager.SignalSerializeNeeded(monster.replica, RakNetBindings.UNASSIGNED_SYSTEM_ADDRESS, true); } Console.Write("Randomized player and monster health and position\n"); ShowStatus(monster, player); } else if (isServer) { if (ch == 'm' || ch == 'M') { if (monster == null) { Console.Write("Creating monster\n"); monster = new Monster(); } else { monster.Dispose(); Console.Write("Deleted monster\n"); monster = null; } } else if (ch == 'p' || ch == 'P') { if (player == null) { Console.Write("Creating player\n"); player = new Player(); } else { player.Dispose(); Console.Write("Deleted player\n"); player = null; } } else if (ch == 's' || ch == 'S') { if (player != null) { bool currentScope; currentScope = replicaManager.IsInScope(player.replica, rakPeer.GetSystemAddressFromIndex(0)); if (currentScope == false) Console.Write("Setting scope for player to true for all remote systems.\n"); else Console.Write("Setting scope for player to false for all remote systems.\n"); replicaManager.SetScope(player.replica, !currentScope, RakNetBindings.UNASSIGNED_SYSTEM_ADDRESS, true); } else { Console.Write("No player to set scope for\n"); } } } } System.Threading.Thread.Sleep(30); } if (monster != null) monster.Dispose(); if (player != null) player.Dispose(); RakNetworkFactory.DestroyRakPeerInterface(rakPeer); return 1; }
public void CloseConnection() { client.CloseConnection(client.GetSystemAddressFromIndex(0), false); client.Shutdown(300); }
static void Main(string[] args) { RakNetStatistics rss = new RakNetStatistics(); RakPeerInterface client = RakPeerInterface.GetInstance(); Packet p = new Packet(); byte packetIdentifier; bool isServer = false; SystemAddress ClientID = RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS; string ip, serverPort, clientPort; Console.WriteLine("This is a sample implementation of a text based chat client"); Console.WriteLine("Connect to the project 'Chat Example Server'"); Console.WriteLine("Enter the client port to listen on"); clientPort = Console.ReadLine(); if (clientPort.Length == 0) { clientPort = "0"; } Console.WriteLine("Enter the IP to connect to"); ip = Console.ReadLine(); if (ip.Length == 0) { ip = "127.0.0.1"; } Console.WriteLine("Enter the port to connect to"); serverPort = Console.ReadLine(); if (serverPort.Length == 0) { serverPort = "1234"; } SocketDescriptor socketDescriptor = new SocketDescriptor(Convert.ToUInt16(clientPort), "0"); socketDescriptor.socketFamily = AF_INET; client.Startup(8, socketDescriptor, 1); client.SetOccasionalPing(true); ConnectionAttemptResult car = client.Connect(ip, Convert.ToUInt16(serverPort), "Rumpelstiltskin", "Rumpelstiltskin".Length); if (car != RakNet.ConnectionAttemptResult.CONNECTION_ATTEMPT_STARTED) { throw new Exception(); } Console.WriteLine("My IP Addresses:"); for (uint i = 0; i < client.GetNumberOfAddresses(); i++) { Console.WriteLine(client.GetLocalIP(i).ToString()); } Console.WriteLine("My GUID is " + client.GetGuidFromSystemAddress(RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS).ToString()); Console.WriteLine("'quit' to quit. 'stat' to show stats. 'ping' to ping.\n'disconnect' to disconnect. 'connect' to reconnnect. Type to talk."); string message; while (true) { System.Threading.Thread.Sleep(30); //Entire networking is threaded if (Console.KeyAvailable) { message = Console.ReadLine(); if (message == "quit") { Console.WriteLine("Quitting"); break; } if (message == "stat") { string message2 = ""; rss = client.GetStatistics(client.GetSystemAddressFromIndex(0)); RakNet.RakNet.StatisticsToString(rss, out message2, 2); Console.WriteLine(message2); continue; } if (message == "disconnect") { Console.WriteLine("Enter index to disconnect: "); string str = Console.ReadLine(); if (str == "") { str = "0"; } uint index = Convert.ToUInt32(str, 16); client.CloseConnection(client.GetSystemAddressFromIndex(index), false); Console.WriteLine("Disconnecting"); continue; } if (message == "shutdown") { client.Shutdown(100); Console.WriteLine("Disconnecting"); continue; } if (message == "ping") { if (client.GetSystemAddressFromIndex(0) != RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS) { client.Ping(client.GetSystemAddressFromIndex(0)); } continue; } if (message == "connect") { Console.WriteLine("Enter the IP to connect to"); ip = Console.ReadLine(); if (ip.Length == 0) { ip = "127.0.0.1"; } Console.WriteLine("Enter the port to connect to"); serverPort = Console.ReadLine(); if (serverPort.Length == 0) { serverPort = "1234"; } ConnectionAttemptResult car2 = client.Connect(ip, Convert.ToUInt16(serverPort), "Rumpelstiltskin", "Rumpelstiltskin".Length); continue; } if (message == "getlastping") { if (client.GetSystemAddressFromIndex(0) != RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS) { Console.WriteLine(client.GetLastPing(client.GetSystemAddressFromIndex(0))); } continue; } if (message.Length > 0) { client.Send(message, message.Length + 1, PacketPriority.HIGH_PRIORITY, PacketReliability.RELIABLE_ORDERED, (char)0, RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS, true); } } for (p = client.Receive(); p != null; client.DeallocatePacket(p), p = client.Receive()) { packetIdentifier = GetPacketIdentifier(p); switch ((DefaultMessageIDTypes)packetIdentifier) { case DefaultMessageIDTypes.ID_DISCONNECTION_NOTIFICATION: Console.WriteLine("ID_DISCONNECTION_NOTIFICATION"); break; case DefaultMessageIDTypes.ID_ALREADY_CONNECTED: Console.WriteLine("ID_ALREADY_CONNECTED with guid " + p.guid); break; case DefaultMessageIDTypes.ID_INCOMPATIBLE_PROTOCOL_VERSION: Console.WriteLine("ID_INCOMPATIBLE_PROTOCOL_VERSION "); break; case DefaultMessageIDTypes.ID_REMOTE_DISCONNECTION_NOTIFICATION: Console.WriteLine("ID_REMOTE_DISCONNECTION_NOTIFICATION "); break; case DefaultMessageIDTypes.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. Console.WriteLine("ID_REMOTE_CONNECTION_LOST"); break; case DefaultMessageIDTypes.ID_CONNECTION_BANNED: // Banned from this server Console.WriteLine("We are banned from this server.\n"); break; case DefaultMessageIDTypes.ID_CONNECTION_ATTEMPT_FAILED: Console.WriteLine("Connection attempt failed "); break; case DefaultMessageIDTypes.ID_NO_FREE_INCOMING_CONNECTIONS: Console.WriteLine("Server is full "); break; case DefaultMessageIDTypes.ID_INVALID_PASSWORD: Console.WriteLine("ID_INVALID_PASSWORD\n"); break; case DefaultMessageIDTypes.ID_CONNECTION_LOST: // Couldn't deliver a reliable packet - i.e. the other system was abnormally // terminated Console.WriteLine("ID_CONNECTION_LOST\n"); break; case DefaultMessageIDTypes.ID_CONNECTION_REQUEST_ACCEPTED: // This tells the client they have connected Console.WriteLine("ID_CONNECTION_REQUEST_ACCEPTED to %s " + p.systemAddress.ToString() + "with GUID " + p.guid.ToString()); Console.WriteLine("My external address is:" + client.GetExternalID(p.systemAddress).ToString()); break; case DefaultMessageIDTypes.ID_CONNECTED_PING: case DefaultMessageIDTypes.ID_UNCONNECTED_PING: Console.WriteLine("Ping from " + p.systemAddress.ToString(true)); break; default: Console.WriteLine(System.Text.Encoding.UTF8.GetString(p.data)); break; } } } client.Shutdown(300); RakNet.RakPeerInterface.DestroyInstance(client); Console.Read(); }
static void Main(string[] args) { RakNetStatistics rss = new RakNetStatistics(); RakPeerInterface server = RakPeerInterface.GetInstance(); server.SetIncomingPassword("Rumpelstiltskin", "Rumpelstiltskin".Length); server.SetTimeoutTime(30000, RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS); Packet p = new Packet(); RakNet.SystemAddress clientID = RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS; byte packetIdentifier; bool isServer = true; string serverPort; Console.WriteLine("Enter the client port to listen on"); serverPort = Console.ReadLine(); if (serverPort.Length == 0) { serverPort = "1234"; } Console.WriteLine("Starting server"); RakNet.SocketDescriptor socketDescriptors = new SocketDescriptor(Convert.ToUInt16(serverPort), "0"); socketDescriptors.port = Convert.ToUInt16(serverPort); socketDescriptors.socketFamily = AF_INET; StartupResult sar = server.Startup(4, socketDescriptors, 1); if (sar != StartupResult.RAKNET_STARTED) { Console.WriteLine("Error starting server"); } server.SetMaximumIncomingConnections(4); System.Threading.Thread.Sleep(1000); server.SetOccasionalPing(true); server.SetUnreliableTimeout(1000); for (int i = 0; i < server.GetNumberOfAddresses(); i++) { SystemAddress sa = server.GetInternalID(RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS, i); Console.WriteLine((i + 1).ToString() + ". " + sa.ToString() + "(LAN = " + sa.IsLANAddress() + ")"); } Console.WriteLine("My GUID is " + server.GetGuidFromSystemAddress(RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS).ToString()); Console.WriteLine("'quit' to quit. 'stat' to show stats. 'ping' to ping.\n'pingip' to ping an ip address\n'ban' to ban an IP from connecting.\n'kick to kick the first connected player.\nType to talk."); string message; while (true) { System.Threading.Thread.Sleep(30); if (Console.KeyAvailable) { message = Console.ReadLine(); if (message == "quit") { Console.WriteLine("Quitting"); break; } if (message == "kick") { server.CloseConnection(clientID, true, 0); continue; } if (message == "stat") { rss = server.GetStatistics(server.GetSystemAddressFromIndex(0)); RakNet.RakNet.StatisticsToString(rss, out message, 2); Console.WriteLine(message); continue; } if (message == "ping") { server.Ping(clientID); continue; } if (message == "list") { SystemAddress[] systems = new SystemAddress[10]; ushort numCons = 10; server.GetConnectionList(out systems, ref numCons); for (int i = 0; i < numCons; i++) { Console.WriteLine((i + 1).ToString() + ". " + systems[i].ToString(true)); } continue; } if (message == "ban") { Console.WriteLine("'Enter IP to ban. You can use * as a wildcard"); message = Console.ReadLine(); server.AddToBanList(message); Console.WriteLine("IP " + message + " added to ban list."); continue; } string message2; message2 = "Server: " + message; server.Send(message2, message2.Length + 1, PacketPriority.HIGH_PRIORITY, PacketReliability.RELIABLE_ORDERED, (char)0, RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS, true); } for (p = server.Receive(); p != null; server.DeallocatePacket(p), p = server.Receive()) { packetIdentifier = GetPacketIdentifier(p); switch ((DefaultMessageIDTypes)packetIdentifier) { case DefaultMessageIDTypes.ID_DISCONNECTION_NOTIFICATION: Console.WriteLine("ID_DISCONNECTION_NOTIFICATION from " + p.systemAddress.ToString(true)); break; case DefaultMessageIDTypes.ID_NEW_INCOMING_CONNECTION: Console.WriteLine("ID_NEW_INCOMING_CONNECTION from " + p.systemAddress.ToString(true) + "with GUID " + p.guid.ToString()); clientID = p.systemAddress; Console.WriteLine("Remote internal IDs: "); for (int index = 0; index < MAXIMUM_NUMBER_OF_INTERNAL_IDS; index++) { SystemAddress internalId = server.GetInternalID(p.systemAddress, index); if (internalId != RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS) { Console.WriteLine((index + 1).ToString() + ". " + internalId.ToString(true)); } } break; case DefaultMessageIDTypes.ID_INCOMPATIBLE_PROTOCOL_VERSION: Console.WriteLine("ID_INCOMPATIBLE_PROTOCOL_VERSION"); break; case DefaultMessageIDTypes.ID_CONNECTED_PING: case DefaultMessageIDTypes.ID_UNCONNECTED_PING: Console.WriteLine("Ping from " + p.systemAddress.ToString(true)); break; case DefaultMessageIDTypes.ID_CONNECTION_LOST: Console.WriteLine("ID_CONNECTION_LOST from " + p.systemAddress.ToString(true)); break; default: Console.WriteLine(System.Text.Encoding.UTF8.GetString(p.data)); message = System.Text.Encoding.UTF8.GetString(p.data); server.Send(message, message.Length + 1, PacketPriority.HIGH_PRIORITY, PacketReliability.RELIABLE_ORDERED, (char)0, RakNet.RakNet.UNASSIGNED_SYSTEM_ADDRESS, true); break; } } } server.Shutdown(300); RakNet.RakPeerInterface.DestroyInstance(server); Console.Read(); }