Пример #1
0
        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;
        }
Пример #2
0
        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);
                }
            }
        }
Пример #3
0
        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(); }
        }