Beispiel #1
0
        void Run()
        {
            byte[] data = new byte[0x1000];
            int    i    = 0;
            int    read;

            while (true)
            {
                try { read = stream.Read(data, i, 0x1000); }
                catch (Exception e) { Log.Error(e.Message); break; }

                if (read == 0)
                {
                    break;
                }

                var packet = new byte[read];
                Array.ConstrainedCopy(data, 0, packet, 0, read);
                i = packets.Queue(packet, this, events);
            }

            cancel.Cancel();

            if (client.Connected)
            {
                events.ClientDisconnected(this, this);
                client.Close();
            }
        }
Beispiel #2
0
        void Run()
        {
            byte[] data = new byte[0x1000];
            int    i    = 0;
            int    read;

            while (true)
            {
                try
                {
                    read = stream.Read(data, i, 0x1000);
                }
                catch (System.IO.IOException ioe)
                {
                    uint err_code = (uint)ioe.HResult;

                    // if it was thrown due closed stream, it's okay
                    // otherwise, we need to log this exception
                    if (err_code != READ_BLOCKED_CODE)
                    {
                        Log.Error(ioe.Message);
                    }

                    break;
                }
                catch (Exception e)
                {
                    Log.Error(e.Message);
                    break;
                }

                if (read == 0)
                {
                    break;
                }

                var packet = new byte[read];
                Array.ConstrainedCopy(data, 0, packet, 0, read);
                i = packets.Queue(packet, this, events);
            }

            cancel.Cancel();

            if (client.Connected)
            {
                events.ClientDisconnected(this, this);
                client.Close();
            }
        }
Beispiel #3
0
 public static void Remove(Dictionary <ulong, ClientHandler> clients, SyncReceiver syncServer, EventHandler events, ulong magic, ClientHandler client, System.Net.EndPoint ip, int AccID)
 {
     try
     {
         foreach (ClientHandler cli in clients.Values)
         {
             if (cli.RemoteEndPoint == null)
             {
                 clients.Remove((ulong)cli.Metadata["magic"]);
                 Authentication.GetUser(syncServer, (ulong)cli.Metadata["magic"]);
                 client.Disconnect();
             }
             else if (cli.RemoteEndPoint == ip)
             {
                 clients.Remove(magic);
                 Authentication.GetUser(syncServer, magic);
                 events.ClientDisconnected(events, client);
             }
         }
     }
     catch (Exception)
     {
         Log.Notice("Account {0} already removed", AccID);
     }
 }
Beispiel #4
0
        public static void CheckVersion(PacketReader packet, PacketBuilder builder, ClientHandler client, EventHandler events)
        {
            var version = packet.ReadInt();

            var ip            = client.RemoteEndPoint.ToString().Split(':')[0];
            var kick          = false;
            var ver           = client.Metadata["version"] as int[];
            var clientVersion = ver[0];
            var ignore        = ver[2];

            if (version != clientVersion && ignore == 0)
            {
                Log.Notice(string.Format("Failed ClientAuth IP: {0} Client ver: {1} Server ver: {2}", ip, version, clientVersion));

                if (version > clientVersion)
                {
                    events.VersionMismatch("login.CheckVersion", new VersionCheckEventArgs(version, ip, VersionCheckResult.NewerClient));
                }
                else
                {
                    events.VersionMismatch("login.CheckVersion", new VersionCheckEventArgs(version, ip, VersionCheckResult.OlderClient));
                }

                kick = true;
            }

            if (ignore == 0)
            {
                version = clientVersion;
            }

            events.VersionMismatch("login.CheckVersion", new VersionCheckEventArgs(version, ip, VersionCheckResult.Match));

            builder.New(0x7A);
            {
                builder += version;     // Client Version
                builder += 0x0059077C;  // Debug
                builder += 0;           // Reserved
                builder += 0;           // Reserved
            }

            client.Send(builder, "CheckVersion");

            if (kick)
            {
                events.ClientDisconnected(client, client);
                return;
            }

            var id = -2;

            var sleep = new Timer(500);

            sleep.Elapsed += (s, _e) =>
            {
                if (id == -2)
                {
                    var syncServer = client.Metadata["syncServer"] as SyncReceiver;
                    id = Authentication.GetUser(syncServer, (ulong)client.Metadata["magic"]);
                }

                if (id > 0)
                {
                    client.AccountID = id;
                    SendChannels.SendChannelList(client);

                    var timer = new Timer(5000);
                    timer.AutoReset = true;
                    timer.Elapsed  += (sender, e) => { SendChannels.SendChannelList(client); };

                    timer.Start();
                    client.Metadata["timer"] = timer;
                }

                sleep.Stop();
            };

            sleep.Start();
        }