Beispiel #1
0
 private void InvokeDisconnected(UOSocket ns)
 {
     if (Disconnected != null)
     {
         Disconnected(ns);
     }
 }
Beispiel #2
0
        private void OnDisconnected(UOSocket state)
        {
            NetState client;

            if (!m_Clients.TryGetValue(state, out client))
            {
                var trace = new System.Diagnostics.StackTrace();
                log.Error("Inconsistent game server state: game client for {0} not found: {1}", state, trace);

                return;
            }

            m_Clients.Remove(state);

            var mob = client.Mobile;

            if (mob != null)
            {
                mob.NetState = null;
            }

            var account = client.Account;

            if (account == null)
            {
                log.Info("Client: {0}: Disconnected. [{1} Online]", client, m_Clients.Count);
            }
            else
            {
                log.Info("Client: {0}: Disconnected. [{1} Online] [{2}]", client, m_Clients.Count, account);
            }

            client.Clear();
        }
Beispiel #3
0
 private void InvokeConnected(UOSocket ns)
 {
     if (Connected != null)
     {
         Connected(ns);
     }
 }
Beispiel #4
0
        public void Send(Packet p)
        {
            if (BlockAllPackets)
            {
                p.OnSend();
                return;
            }

            var prof  = PacketProfile.GetOutgoingProfile((byte)p.PacketID);
            var start = (prof == null ? DateTime.MinValue : DateTime.UtcNow);

            int length;
            var buffer = p.Compile(CompressionEnabled, out length);

            if (buffer != null && buffer.Length > 0 && length > 0)
            {
                UOSocket.Send(buffer, length);
            }

            if (prof != null)
            {
                prof.Record(length, DateTime.UtcNow - start);
            }

            p.OnSend();
        }
Beispiel #5
0
        public void OnReceive(UOSocket ns, int byteCount)
        {
            lock (m_PendingQueue)
                m_PendingQueue.Enqueue(ns);

            Incoming += byteCount;

            //Core.WakeUp();
        }
Beispiel #6
0
        private void InvokeReceived(UOSocket ns, ByteQueue buffer, out bool throttle)
        {
            throttle = false;

            if (Received != null)
            {
                Received(ns, buffer, out throttle);
            }
        }
Beispiel #7
0
        private void CheckListener()
        {
            foreach (var socket in m_Listeners.SelectMany(listener => listener.Slice()))
            {
                var ns = new UOSocket(socket, this);
                ns.Start();

                if (ns.Running)
                {
                    InvokeConnected(ns);
                }
            }
        }
Beispiel #8
0
        public NetState(UOSocket uoSocket)
        {
            UOSocket = uoSocket;

            Seeded       = false;
            m_Gumps      = new List <Gump>();
            m_HuePickers = new HashSet <HuePicker>();
            m_Menus      = new HashSet <IMenu>();
            m_Trades     = new HashSet <SecureTrade>();

            // Ensure client version is NEVER null.
            Version = new ClientVersion(0, 0, 0, 0, ClientType.Classic);

            Running = true;
        }
Beispiel #9
0
        private bool VerifySocket(Socket socket)
        {
            try
            {
                var args = new SocketConnectEventArgs(socket);

                EventSink.InvokeSocketConnect(args);

                return(args.AllowConnection);
            }
            catch (Exception ex)
            {
                UOSocket.TraceException(ex);

                return(false);
            }
        }
Beispiel #10
0
        private void Release(Socket socket)
        {
            try
            {
                socket.Shutdown(SocketShutdown.Both);
            }
            catch (SocketException ex)
            {
                UOSocket.TraceException(ex);
            }

            try
            {
                socket.Close();
            }
            catch (SocketException ex)
            {
                UOSocket.TraceException(ex);
            }
        }
Beispiel #11
0
        private void OnAccept(IAsyncResult asyncResult)
        {
            Socket accepted = null;

            try
            {
                accepted = m_Listener.EndAccept(asyncResult);
            }
            catch (SocketException ex)
            {
                UOSocket.TraceException(ex);
            }
            catch (ObjectDisposedException)
            {
                return;
            }

            if (accepted != null)
            {
                if (VerifySocket(accepted))
                {
                    Enqueue(accepted);
                }
                else
                {
                    Release(accepted);
                }
            }

            try
            {
                m_Listener.BeginAccept(m_OnAccept, m_Listener);
            }
            catch (SocketException ex)
            {
                UOSocket.TraceException(ex);
            }
            catch (ObjectDisposedException)
            {
            }
        }
Beispiel #12
0
        private void OnReceived(UOSocket state, ByteQueue buffer, out bool throttle)
        {
            throttle = false;
            NetState client;

            if (!m_Clients.TryGetValue(state, out client))
            {
                log.Error("Inconsistent game server state: game client for {0} not found", state);
                return;
            }

            if (!client.Seeded)
            {
                if (buffer.GetPacketID() == 0xEF)
                {
                    client.Seeded = true;
                }
                else if (buffer.Length >= 4)
                {
                    var peek = new byte[4];
                    buffer.Dequeue(peek, 0, 4);

                    var seed = (peek[0] << 24) | (peek[1] << 16) | (peek[2] << 8) | peek[3];

                    if (seed == 0)
                    {
                        log.Info("Login: {0}: Invalid client detected, disconnecting", client);
                        client.Dispose();

                        return;
                    }

                    client.m_Seed = seed;
                    client.Seeded = true;
                }
                else
                {
                    return;                     // Need at least 4 bytes for the seed
                }
            }

            var length = buffer.Length;

            while (length > 0 && buffer.Length > 0)
            {
                int packetID = buffer.GetPacketID();

                if (!client.SentFirstPacket && packetID != 0xF1 && packetID != 0xCF && packetID != 0x80 && packetID != 0x91 && packetID != 0xA4 && packetID != 0xEF)
                {
                    log.Info("Client: {0}: Encrypted client detected, disconnecting", client);
                    client.Dispose();
                    return;
                }

                var handler = PacketHandlers.GetHandler(packetID);

                if (handler == null)
                {
                    var data = new byte[length];
                    length = buffer.Dequeue(data, 0, length);

                    if (Core.Logging)
                    {
                        var reader = PacketReader.CreateInstance(data, length, false);
                        reader.Trace(client);
                        PacketReader.ReleaseInstance(reader);
                    }

                    return;
                }

                var packetLength = handler.Length;

                if (packetLength == 0)
                {
                    // Dynamic length packet. Need at leaset 3 bytes (1 packet cmd + 2 length)

                    if (length >= 3)
                    {
                        packetLength = buffer.GetPacketLength();

                        if (packetLength < 3)
                        {
                            client.Dispose();
                            return;
                        }
                    }
                    else
                    {
                        break;
                    }
                }

                if (length >= packetLength)
                {
                    if (handler.Ingame && client.Mobile == null)
                    {
                        log.Info("Client: {0}: Sent ingame packet (0x{1:X2}) before having been attached to a mobile", client, packetID);
                        client.Dispose();
                        return;
                    }
                    else if (handler.Ingame && client.Mobile.Deleted)
                    {
                        client.Dispose();
                        return;
                    }
                    else
                    {
                        var throttler = handler.ThrottleCallback;

                        if (throttler != null && !throttler(client))
                        {
                            throttle = true;
                            return;
                        }

                        var profile = PacketProfile.GetIncomingProfile(packetID);
                        var start   = (profile == null ? DateTime.MinValue : DateTime.UtcNow);

                        byte[] packetBuffer;

                        if (BufferSize >= packetLength)
                        {
                            packetBuffer = m_Buffers.AcquireBuffer();
                        }
                        else
                        {
                            packetBuffer = new byte[packetLength];
                        }

                        packetLength = buffer.Dequeue(packetBuffer, 0, packetLength);

                        var reader = PacketReader.CreateInstance(packetBuffer, packetLength, handler.Length != 0);

                        try
                        {
                            handler.OnReceive(client, reader);
                        }
                        catch (Exception e)
                        {
                            log.Error("Exception disarmed in HandleReceive from {0}: {1}", client.Address, e);
                        }

                        PacketReader.ReleaseInstance(reader);

                        length = buffer.Length;

                        if (BufferSize >= packetLength)
                        {
                            m_Buffers.ReleaseBuffer(packetBuffer);
                        }

                        if (profile != null)
                        {
                            profile.Record(packetLength, DateTime.UtcNow - start);
                        }
                    }
                }
                else
                {
                    break;
                }
            }
        }
Beispiel #13
0
 public void Flush()
 {
     UOSocket.Flush();
 }
Beispiel #14
0
        private void OnConnected(UOSocket state)
        {
            m_Clients.Add(state, new NetState(state));

            log.Info("Client: {0}: Connected. [{1} Online]", state, m_Clients.Count);
        }
Beispiel #15
0
 public void OnDisposed(UOSocket ns)
 {
     m_DisposedQueue.Enqueue(ns);
 }
Beispiel #16
0
        public void Dispose()
        {
            Running = false;

            UOSocket.Dispose();
        }
Beispiel #17
0
 public void OnSend(UOSocket ns, int byteCount)
 {
     Outgoing += byteCount;
 }
Beispiel #18
0
 public void OnStarted(UOSocket ns)
 {
     m_NetStates.Add(ns);
 }
Beispiel #19
0
 public override string ToString()
 {
     return(UOSocket.ToString());
 }