public void Connect(bool Loopback = false) { if (Loopback) { string[] HostsL = File.ReadAllLines(HostsPath); if (!Array.Exists(HostsL, IP => Addresses.Contains(IP))) { List <string> _GameIPs = Addresses.ToList(); if (!_GameIPs.Contains(Host)) { _GameIPs.Add(Host); } string Mapping = string.Format("127.0.0.1\t\t{{0}}\t\t#{0}[{{1}}/{1}]", Host, _GameIPs.Count); File.AppendAllLines(HostsPath, _GameIPs.Select(IP => string.Format(Mapping, IP, _GameIPs.IndexOf(IP) + 1))); } } (TCP = new HTCPExt(IPAddress.Any, Port)).Start(); TCP.BeginAcceptSocket(SocketAccepted, null); DisconnectAllowed = true; }
public void Disconnect() { lock (DisconnectLock) { if (!DisconnectAllowed) { return; } DisconnectAllowed = false; if (ClientS != null) { ClientS.Shutdown(SocketShutdown.Both); ClientS.Close(); ClientS = null; } if (ServerS != null) { ServerS.Shutdown(SocketShutdown.Both); ServerS.Close(); ServerS = null; } ResetHost(); if (TCP != null) { TCP.Stop(); TCP = null; } Protocol = HProtocols.Unknown; ToClientS = ToServerS = SocketCount = 0; ClientB = ServerB = SCache = CCache = null; HasOfficialSocket = RequestEncrypted = ResponseEncrypted = false; ClientEncrypt = ClientDecrypt = ServerEncrypt = ServerDecrypt = null; if (OnDisconnected != null) { OnDisconnected(this, EventArgs.Empty); } } }
private void DataFromClient(IAsyncResult iAr) { try { if (ClientS == null) { return; } int Length = ClientS.EndReceive(iAr); if (Length > 0) { byte[] Data = ByteUtils.CopyBlock(ClientB, 0, Length); #region Official Socket Check if (!HasOfficialSocket) { bool IsModern = false; if (HasOfficialSocket = (Ancient.DecypherShort(Data, 3) == 206 || (IsModern = BigEndian.DecypherShort(Data, 4) == 4000))) { TCP.Stop(); TCP = null; ResetHost(); Protocol = IsModern ? HProtocols.Modern : HProtocols.Ancient; if (OnConnected != null) { OnConnected(this, EventArgs.Empty); } } else { SendToServer(Data); return; } } #endregion try { #region Decrypt/Split if (ClientDecrypt != null) { ClientDecrypt.Parse(Data); } if ((ToServerS + 1) == 4 && Protocol == HProtocols.Modern) { int DLength = BigEndian.DecypherInt(Data); RequestEncrypted = (DLength > Data.Length - 4 || DLength < 6); } byte[][] Chunks = RequestEncrypted ? new byte[1][] { Data } : Chunks = ByteUtils.Split(ref SCache, Data, HDestinations.Server, Protocol); #endregion foreach (byte[] Chunk in Chunks) { ++ToServerS; if (DataToServer == null) { SendToServer(Chunk); } else { DataToEventArgs Args = new DataToEventArgs(Chunk, HDestinations.Server, ToServerS); try { DataToServer(this, Args); } catch { SendToServer(Chunk); continue; } if (!Args.Skip) { SendToServer(Args.Packet.ToBytes()); } } if (CaptureEvents && !RequestEncrypted) { DataFromClient(Chunk); } } } catch { SendToServer(Data); } ReadClientData(); } else { Disconnect(); } } catch { Disconnect(); } }