Beispiel #1
0
        private void HandleNetwork()
        {
            while (true)
            {
                if (ShuttingDown)
                {
                    return;
                }

                for (int i = 0; i < Clients.Count; i++)
                {
                    //TODO: Kick client due to keep alive timeouts.
                    while (Clients[i].Client.NetworkManager.DataAvailable)
                    {
                        try
                        {
                            /* S <- P <- C
                             * Proxying data from client to server.
                             */

                            var rawPacket       = (byte[])null;                                                                    // raw encrypted packet
                            var decryptedPacket = (byte[])null;
                            var packet          = Clients[i].Client.NetworkManager.ReadPacket(out rawPacket, out decryptedPacket); // receive data from client

                            if (packet != null)
                            {
                                HandlePacket(Clients[i], packet);
                                if (rawPacket != null)
                                {
                                    Clients[i].Server.NetworkManager.CoCStream.Write(rawPacket, 0, rawPacket.Length); // sends data back to server
                                    PacketDumper.LogPacket(packet, PacketDirection.Server, decryptedPacket);
                                    PacketLog.LogData(packet, PacketDirection.Server);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            ExceptionLog.LogData(ex);
                            Clients.RemoveAt(i);
                            goto ResetLoop;
                        }
                    }

                    if (Clients[i].Server == null)
                    {
                        continue;
                    }

                    while (Clients[i].Server.NetworkManager.DataAvailable)
                    {
                        try
                        {
                            /* S -> P -> C
                             * Proxying data from server to client.
                             */

                            var rawPacket       = (byte[])null;
                            var decryptedPacket = (byte[])null;
                            var packet          = Clients[i].Server.NetworkManager.ReadPacket(out rawPacket, out decryptedPacket); // receive data from server

                            if (packet != null)
                            {
                                HandlePacket(Clients[i], packet);
                                if (rawPacket != null)
                                {
                                    Clients[i].Client.NetworkManager.CoCStream.Write(rawPacket, 0, rawPacket.Length); // sends data back to client
                                    PacketDumper.LogPacket(packet, PacketDirection.Client, decryptedPacket);
                                    PacketLog.LogData(packet, PacketDirection.Client);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            ExceptionLog.LogData(ex);
                            Clients.RemoveAt(i);
                            goto ResetLoop;
                        }
                    }

                    continue;
ResetLoop:
                    break;
                }
                Thread.Sleep(1);
            }
        }
Beispiel #2
0
        private void HandleNetwork()
        {
            while (true)
            {
                if (ShuttingDown)
                {
                    return;
                }

                for (int i = 0; i < Clients.Count; i++)
                {
                    //TODO: Kick client due to keep alive timeouts.
                    while (Clients[i].Client.NetworkManager.DataAvailable)
                    {
                        try
                        {
                            /* S <- P <- C
                             * Proxying data from client to server.
                             */

                            var rawPacket       = (byte[])null;                                                                    // raw encrypted packet
                            var decryptedPacket = (byte[])null;
                            var packet          = Clients[i].Client.NetworkManager.ReadPacket(out rawPacket, out decryptedPacket); // receive data from client

                            if (packet != null)
                            {
                                HandlePacket(Clients[i], packet);
                            }

                            if (rawPacket != null && packet != null)
                            {
                                Clients[i].Server.NetworkManager.CoCStream.Write(rawPacket, 0, rawPacket.Length); // sends data back to server
                                PacketLogger.LogPacket(packet, PacketDirection.Server);
                                PacketDumper.LogPacket(packet, PacketDirection.Server, decryptedPacket);
                            }
                        }
                        catch (InvalidPacketException ex)
                        {
                            Console.WriteLine("[InvalidPacketException]: Client => {0}", ex.Message);
                            // break;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("[{0}]: Client => {1}", ex.GetType().Name, ex.Message);
                            Clients.RemoveAt(i);
                            break;
                        }
                    }

                    if (Clients[i].Server == null)
                    {
                        continue;
                    }

                    while (Clients[i].Server.NetworkManager.DataAvailable)
                    {
                        try
                        {
                            /* S -> P -> C
                             * Proxying data from server to client.
                             */

                            var rawPacket       = (byte[])null;
                            var decryptedPacket = (byte[])null;
                            var packet          = Clients[i].Server.NetworkManager.ReadPacket(out rawPacket, out decryptedPacket); // receive data from server

                            if (packet != null)
                            {
                                HandlePacket(Clients[i], packet);
                            }

                            if (rawPacket != null && packet != null)
                            {
                                // could log packets in a sperate thread
                                Clients[i].Client.NetworkManager.CoCStream.Write(rawPacket, 0, rawPacket.Length); // sends data back to client
                                PacketLogger.LogPacket(packet, PacketDirection.Client);
                                PacketDumper.LogPacket(packet, PacketDirection.Client, decryptedPacket);
                            }
                        }
                        catch (InvalidPacketException ex)
                        {
                            Console.WriteLine("[InvalidPacketException]: Client => {0}", ex.Message);
                            // break;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("[{0}]: Client => {1}", ex.GetType().Name, ex.Message);
                            Clients.RemoveAt(i);
                            break;
                        }
                    }
                }
                Thread.Sleep(1);
            }
        }