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(); } }
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(); } }
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); } }
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(); }