/// <summary>
        /// Processes an incoming message and handles any of the possible types of packets it could be.
        /// </summary>
        private void processIncomingMessage(IncomingMessage incomingMessage, IPEndPoint endPoint)
        {
            if (incomingMessage.BytesLeft < 2)
            {
                return;
            }
            PacketType       packetType       = (PacketType)incomingMessage.ReadByte();
            PacketTypeDetail packetTypeDetail = (PacketTypeDetail)incomingMessage.ReadByte();

            if (this.endPointToClientID.TryGetValue(endPoint, out int clientID))
            {
                ClientNetworkConnection client = this.clients[clientID];
                if (packetType == PacketType.ClientConnectFinalize)
                {
                    client.SetStateConnected(endPoint, this.NetworkTick);
                }
                else if (packetType == PacketType.GameUpdate && packetTypeDetail == PacketTypeDetail.GameUpdateFromClient)
                {
                    client.EnqueueGameUpdateIncomingMessage(incomingMessage, this.NetworkTick);
                }
            }
            else
            {
                // A message from a non-connected endpoint, only process it if its a connection request
                if (packetType == PacketType.ClientConnectRequest)
                {
                    this.processClientConnectRequest(incomingMessage, endPoint);
                }
            }
        }
 /// <summary>
 /// Immediately sends a packet to the given end point in response to a connection request.
 /// </summary>
 private void sendConnectRequest(PacketType packetType, PacketTypeDetail packetTypeInfo)
 {
     this.outgoingMessage.Reset();
     this.outgoingMessage.Write((byte)packetType);
     this.outgoingMessage.Write((byte)packetTypeInfo);
     this.outgoingMessage.Write(ReaderWriterHelper.GetStringHash(this.ApplicationID));
     this.outgoingMessage.Write(this.MaxMessageSize);
     this.outgoingMessage.Write("No name");
     ((INetworkConnection)this).SendMessage(this.outgoingMessage);
 }
 /// <summary>
 /// Immediately sends a packet to the given end point in response to a connection request.
 /// </summary>
 private void sendConnectResponse(IPEndPoint toEndPoint, byte clientID, PacketTypeDetail packetTypeInfo)
 {
     this.outgoingMessage.Reset();
     this.outgoingMessage.Write((byte)PacketType.ServerConnectResponse);
     this.outgoingMessage.Write((byte)packetTypeInfo);
     this.outgoingMessage.Write(clientID);
     this.outgoingMessage.Write(ReaderWriterHelper.GetStringHash(this.ApplicationID));
     this.outgoingMessage.Write(this.MaxMessageSize);
     ((INetworkConnection)this.clients[clientID]).SendMessage(this.outgoingMessage);
 }
        /// <summary>
        /// Processes an incoming message and handles any of the possible types of packets it could be.
        /// </summary>
        private void processIncomingMessage(IncomingMessage incomingMessage, IPEndPoint endPoint)
        {
            if (incomingMessage.BytesLeft < 2)
            {
                return;
            }
            PacketType       packetType       = (PacketType)incomingMessage.ReadByte();
            PacketTypeDetail packetTypeDetail = (PacketTypeDetail)incomingMessage.ReadByte();

            if (packetType == PacketType.ServerConnectResponse)
            {
                if (packetTypeDetail == PacketTypeDetail.ConnectResponseAccept)
                {
                    this.sendConnectRequest(PacketType.ClientConnectFinalize, PacketTypeDetail.None);
                    this.IsConnected = true;
                }
            }
            else if (packetType == PacketType.GameUpdate && packetTypeDetail == PacketTypeDetail.GameUpdateFromServer)
            {
                this.enqueueGameUpdateIncomingMessage(incomingMessage);
            }
        }