Example #1
0
		public NetState(Socket socket, SocketConnector messagePump) {
			mSocket = socket;
			mBuffer = new ByteQueue();
			Seeded = false;
			mRunning = false;
			mRecvBuffer = new byte[BufferSize];
			mMessagePump = messagePump;

			mSendQueue = new SendQueue();
			UpdateAcitivty();

			mInstances.Add(this);

			try {
				mAddress = ((IPEndPoint)mSocket.RemoteEndPoint).Address.Intern();
				mToString = mAddress.ToString();
			} catch (Exception ex) {
				throw;
			}

			mConnectedOn = DateTime.Now;

			if (mCreatedCallback != null) {
				mCreatedCallback(this);
			}
		}
Example #2
0
        private async Task ReadClientHandler(OwnTcpServerConnection connection, AsyncQueue <OwnTcpSendMessage> processQueue)
        {
            try
            {
                while (connection.Client.Connected)
                {
                    OwnTcpMessage message = await connection.ReadMessage();

                    if (message == null || !connection.Client.Connected)
                    {
                        break;
                    }

                    switch (message.Topic)
                    {
                    case PingCmd:
                        await SendAnswer(connection, message.ID, 200);

                        break;

                    case SyncCmd:
                        ByteQueue data = new ByteQueue();
                        data.Enqueue(Service);
                        await SendMessageToClient(connection, SyncCmd, message.ID, data);

                        break;

                    case CloseCmd:
                        await CloseConnection(connection, false);

                        return;

                    default:
                        OwnTcpSendMessage processItem = new OwnTcpSendMessage(message);
                        await processQueue.Enqueue(processItem);

                        if (await processItem.Task)
                        {
                            Task responseTask = message.IsFireAndForget
                                    ? Task.CompletedTask
                                    : SendAnswer(connection, message.ID, 200);

                            await SendMessageToAllOtherClients(connection, message.Topic, message.Payload);

                            await responseTask;
                        }
                        else
                        {
                            await CloseConnection(connection);
                        }
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                await CloseConnection(connection);
            }
        }
Example #3
0
        protected Task PublishShuffle(IPlaylistBase playlist)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue((int)playlist.Shuffle);

            return(PublishPlaylistAsync(playlist, nameof(playlist.Shuffle), data));
        }
Example #4
0
 public Encryption()
 {
     m_AlreadyRelayed = false;
     m_Encryption     = null;
     m_Buffer         = new ByteQueue();
     m_Seeded         = false;
     m_Seed           = 0;
 }
 public Encryption()
 {
     m_AlreadyRelayed = false;
     m_Encryption = null;
     m_Buffer = new ByteQueue();
     m_Seeded = false;
     m_Seed = 0;
 }
Example #6
0
        protected async Task PublishMediaSources(ISourcePlaylistBase source)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(source.FileMediaSources);

            await PublishPlaylistAsync(source, nameof(source.FileMediaSources), data);
        }
Example #7
0
        private Task PublishName(IPlaylistBase playlist)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(playlist.Name);

            return(PublishPlaylistAsync(playlist, nameof(playlist.Name), data));
        }
        private Task PublishWannaSong(IPlaylistBase playlist)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(playlist.WannaSong);

            return(SendAsync(playlist, nameof(playlist.WannaSong), data, false));
        }
        protected Task PublishPosition(IPlaylistBase playlist)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(playlist.Position);

            return(SendAsync(playlist, nameof(playlist.Position), data, false));
        }
Example #10
0
        private Task PublishWannaSong(IPlaylistBase playlist)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(playlist.WannaSong);

            return(PublishPlaylistAsync(playlist, nameof(playlist.WannaSong), data, MqttQualityOfServiceLevel.AtMostOnce, false));
        }
        protected Task PublishMediaSources(ISourcePlaylistBase source)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(source.FileMediaSources);

            return(SendAsync(source, nameof(source.FileMediaSources), data, false));
        }
        protected Task PublishLoop(IPlaylistBase playlist)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue((int)playlist.Loop);

            return(SendAsync(playlist, nameof(playlist.Loop), data, false));
        }
        protected Task PublishPlayState()
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue((int)Service.PlayState);

            return(SendAsync(nameof(Service.PlayState), data, false));
        }
        protected Task PublishVolume()
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(Service.Volume);

            return(SendAsync(nameof(Service.Volume), data, true));
        }
Example #15
0
        protected async Task PublishPlayState()
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue((int)Service.PlayState);

            await PublishServiceAsync(nameof(Service.PlayState), data);
        }
        protected Task PublishSongs(IPlaylistBase playlist)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(playlist.Songs);

            return(SendAsync(playlist, nameof(playlist.Songs), data, false));
        }
Example #17
0
        protected Task PublishDuration(IPlaylistBase playlist)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(playlist.Duration);

            return(PublishPlaylistAsync(playlist, nameof(playlist.Duration), data));
        }
Example #18
0
        protected Task PublishCurrentSong(IPlaylistBase playlist)
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(playlist.CurrentSong);

            return(PublishPlaylistAsync(playlist, nameof(playlist.CurrentSong), data));
        }
Example #19
0
        protected async Task PublishCurrentPlaylist()
        {
            ByteQueue data = new ByteQueue();

            data.Enqueue(GetPlaylistType(Service.CurrentPlaylist));
            data.Enqueue(Service.CurrentPlaylist?.ID);

            await Task.WhenAll(PublishServiceAsync(nameof(Service.CurrentPlaylist), data), AddPlaylist(Service.CurrentPlaylist));
        }
Example #20
0
    public override void FromBytes(ByteQueue bytes)
    {
        var count = bytes.GetByte();

        for (int i = 0; i < count; i++)
        {
            Add(new Entity(bytes.GetByte()));
        }
    }
Example #21
0
    public override void FromBytes(ByteQueue bytes)
    {
        var count = bytes.GetByte();

        for (int i = 0; i < count; i++)
        {
            Add(bytes.GetIToBytes <T>(type));
        }
    }
Example #22
0
    public virtual void FromBytes(ByteQueue bytes)
    {
        var count = bytes.GetInt();

        for (int i = 0; i < count; i++)
        {
            Add(new Entity(bytes.GetInt()));
        }
    }
Example #23
0
        public void TestLengthAfterWrite()
        {
            ByteQueue queue = new ByteQueue();

            byte[] input = Encoding.ASCII.GetBytes("hello world!");
            queue.Enqueue(input, 0, input.Length);

            Assert.AreEqual(input.Length, queue.Length);
        }
Example #24
0
    public void FromBytes(ByteQueue bytes)
    {
        var count = bytes.GetInt();

        for (int i = 0; i < count; i++)
        {
            Add(bytes.GetString());
        }
    }
Example #25
0
        private static void OnReceiveMessage(object sender, Message <Socket> e)
        {
            var bytes   = new ByteQueue(e.bytes);
            var command = (CommandEnum)bytes.GetByte();

            if (command == CommandEnum.Input)
            {
                // Receive Input:
            }
            if (command == CommandEnum.StateUpdate)
            {
                var state = new TransformState();
                state.FromBytes(bytes);
                Console.WriteLine($"TCPClient {e.client.Handle}: {state}");

                var existingState = stateHistory.GetState(state.tick);
                if (existingState != null)
                {
                    existingState.Clear();
                    existingState.entities.AddRange(state.entities);
                }
                else
                {
                    stateHistory.Add(state);
                    foreach (var client in clients)
                    {
                        server.Send(client, Packet.Create(CommandEnum.StateUpdate, state.ToBytes()));
                    }
                }
            }
            if (command == CommandEnum.DeltaStateUpdate)
            {
                var deltaState = new TransformDeltaState();
                deltaState.FromBytes(bytes);
                Console.WriteLine($"TCPClient {e.client.Handle}: {deltaState}");
                var startState = stateHistory.GetState(deltaState.startStateTick);
                if (startState != null)
                {
                    var endState = (TransformState)deltaState.GenerateEndState(startState);
                    Console.WriteLine($"End State Generated: {endState}");
                    var existingState = stateHistory.GetState(endState.tick);
                    if (existingState != null)
                    {
                        existingState.Clear();
                        existingState.entities.AddRange(endState.entities);
                    }
                    else
                    {
                        stateHistory.Add(endState);
                        foreach (var client in clients)
                        {
                            server.Send(client, Packet.Create(CommandEnum.StateUpdate, endState.ToBytes()));
                        }
                    }
                }
            }
        }
        public override void doAction(int readed)
        {
            DecodeIncomingPacket(m_ListenSocket, ref data, ref readed, true);
            ByteQueue temp = new ByteQueue(this);

            temp.Enqueue(data, 0, readed);
            temp.Socket = m_ListenSocket;
            HandleReceive(temp);
        }
Example #27
0
        public override ByteQueue ToBytes()
        {
            var output = new ByteQueue();

            output.Enqueue(Compression.MapToByte(X, MIN_POSITION, MAX_POSITION));
            output.Enqueue(Compression.MapToByte(Y, MIN_POSITION, MAX_POSITION));
            output.Enqueue(Compression.MapToByte(Z, MIN_POSITION, MAX_POSITION));
            return(output);
        }
Example #28
0
        protected async Task PublishSearchKey()
        {
            return;

            ByteQueue data = new ByteQueue();

            data.Enqueue(Service.SearchKey);

            await PublishServiceAsync(nameof(Service.SearchKey), data);
        }
Example #29
0
 public void Displose()
 {
     buffer = null;
     tmpbuf = null;
     m_Crypto.Dispose();
     m_SendControlCode = null;
     m_RecvControlCode = null;
     _queue            = null;
     //m_UserInfo = null;
 }
Example #30
0
 public Client(string Name, PacketskHandler hander)
 {
     proxyIp = ConfigurationManager.AppSettings.Get("proxyIp").Split('.');
     //m_Thread = new Thread(new ThreadStart(ThreadStartHander));
     //m_Thread.Name = Name;
     //m_Thread.Start();
     m_Buffer             = new ByteQueue(this);
     this.m_PacketsHander = hander;
     this.m_Disposed      = false;
 }
Example #31
0
        private void Setup(uint sequenceNumber, uint acknowlegementNumber)
        {
            this.send_queue = new SendQueue(acknowlegementNumber, Socket.packet_size);

            this.recv_queue = new RecvQueue(sequenceNumber, 1);

            this.byte_queue = new ByteQueue();

            this.OnConnect();
        }
Example #32
0
        protected async Task PublishIsSearchShuffle()
        {
            return;

            ByteQueue data = new ByteQueue();

            data.Enqueue(Service.IsSearchShuffle);

            await PublishServiceAsync(nameof(Service.IsSearchShuffle), data);
        }
Example #33
0
        public NetState(Socket socket, MessagePump messagePump)
        {
            m_Socket = socket;
            m_Buffer = new ByteQueue();
            m_Running = false;
            m_RecvBuffer = m_ReceiveBufferPool.AcquireBuffer();
            m_MessagePump = messagePump;
            m_SendQueue = new SendQueue();

            m_NextCheckActivity = DateTime.Now + TimeSpan.FromMinutes(0.5);
        }
Example #34
0
		public virtual void Dispose(bool flush) {
			if (mDisposing)
				return;

			ServerConsole.StatusLine("{0}: Disconnected.", this);
			mDisposing = true;

			//##PACKET## Logout
			Thread.Sleep(100);

			if (flush) {
				flush = Flush();
			}

			// Check for existing objects in the World
			// FIXME - Account cant be removed
			// We need to check using World.GetAccount() after a new connection
			// from login -> char or char -> world
			// ...
			//if (Account != null) {
			//	World.RemoveObject(Account);
			//}

			if (mSocket != null) {
				try {
					mSocket.Shutdown(SocketShutdown.Both);
				} catch (SocketException ex) {
					ExceptionHandler.Trace(ex);
				}

				try {
					mSocket.Close();
					SocketPool.ReleaseSocket(mSocket);
				} catch (SocketException ex) {
					ExceptionHandler.Trace(ex);
				}
				mSocket = null;
			}

			mBuffer = null;
			mRecvBuffer = null;
			mOnReceive = null;
			mOnSend = null;
			mRunning = false;

			mDisposed.Enqueue(this);

			if (!mSendQueue.IsEmpty) {
				lock (mSendQueue) {
					mSendQueue.Clear();
				}
			}
		}
Example #35
0
        public void FinishDispose()
        {
            if (m_DisposeFinished)
                return;

            m_DisposeFinished = true;

            try { m_Socket.Shutdown( SocketShutdown.Both ); }
            catch {}

            try { m_Socket.Close(); }
            catch {}

            if ( m_RecvBuffer != null )
                m_ReceiveBufferPool.ReleaseBuffer( m_RecvBuffer );

            m_Socket = null;

            m_Buffer = null;
            m_RecvBuffer = null;
            m_OnReceive = null;
            m_OnSend = null;
            m_Running = false;

            m_Disposed.Enqueue( this );

            if ( /*!flush &&*/ !m_SendQueue.IsEmpty )
            {
                lock ( m_SendQueue )
                    m_SendQueue.Clear();
            }
        }
Example #36
0
        public NetState( Socket socket, MessagePump messagePump )
        {
            m_Socket = socket;
            m_Buffer = new ByteQueue();
            m_Seeded = false;
            m_Running = false;
            m_RecvBuffer = m_ReceiveBufferPool.AquireBuffer();
            m_MessagePump = messagePump;
            m_Gumps = new GumpCollection();
            m_HuePickers = new HuePickerCollection();
            m_Menus = new MenuCollection();
            m_Trades = new ArrayList();

            m_SendQueue = new SendQueue();

            m_NextCheckActivity = DateTime.Now + TimeSpan.FromMinutes( 0.5 );

            m_Instances.Add( this );

            try{ m_Address = ((IPEndPoint)m_Socket.RemoteEndPoint).Address; m_ToString = m_Address.ToString(); }
            catch{ m_Address = IPAddress.None; m_ToString = "(error)"; }

            m_Super = Core.Config.LoginConfig.IsSuperClient(m_ToString);

            if ( m_CreatedCallback != null )
                m_CreatedCallback( this );
        }
Example #37
0
        /** client constructor, used to connect to other UO servers */
        public NetState( IPEndPoint connectTo, MessagePump messagePump )
        {
            m_Socket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
            m_EndPoint = connectTo;
            m_Buffer = new ByteQueue();
            m_Seeded = true;
            m_Running = false;
            m_Client = true;
            m_RecvBuffer = m_ReceiveBufferPool.AquireBuffer();
            m_MessagePump = messagePump;

            m_SendQueue = new SendQueue();

            m_NextCheckActivity = Core.Now + TimeSpan.FromMinutes( 0.5 );

            m_Instances.Add( this );

            try {
                m_Address = m_EndPoint.Address;
                m_ToString = "[To GameServer " + m_EndPoint.ToString() + "]";
            } catch{ m_Address = IPAddress.None; m_ToString = "(error)"; }

            if ( m_CreatedCallback != null )
                m_CreatedCallback( this );
        }
Example #38
0
        public virtual void Dispose( bool flush )
        {
            if ( m_Socket == null || m_Disposing ) {
                return;
            }

            m_Disposing = true;

            if ( flush )
                flush = Flush();

            try {
                m_Socket.Shutdown( SocketShutdown.Both );
            } catch ( SocketException ex ) {
                TraceException( ex );
            }

            try {
                m_Socket.Close();

                SocketPool.ReleaseSocket( m_Socket );
            } catch ( SocketException ex ) {
                TraceException( ex );
            }

            if ( m_RecvBuffer != null )
                m_ReceiveBufferPool.ReleaseBuffer( m_RecvBuffer );

            m_Socket = null;

            m_Buffer = null;
            m_RecvBuffer = null;
            m_OnReceive = null;
            m_OnSend = null;
            m_Running = false;

            m_Disposed.Enqueue( this );

            if ( /*!flush &&*/ !m_SendQueue.IsEmpty ) {
                lock ( m_SendQueue )
                    m_SendQueue.Clear();
            }
        }
Example #39
0
        public NetState( Socket socket, MessagePump messagePump )
        {
            m_Socket = socket;
            m_Buffer = new ByteQueue();
            m_Seeded = false;
            m_Running = false;
            m_RecvBuffer = m_ReceiveBufferPool.AcquireBuffer();
            m_MessagePump = messagePump;
            m_Gumps = new List<Gump>();
            m_HuePickers = new List<HuePicker>();
            m_Menus = new List<IMenu>();
            m_Trades = new List<SecureTrade>();

            m_SendQueue = new SendQueue();

            m_NextCheckActivity = DateTime.Now + TimeSpan.FromMinutes( 0.5 );

            m_Instances.Add( this );

            try {
                m_Address = Utility.Intern( ( ( IPEndPoint ) m_Socket.RemoteEndPoint ).Address );
                m_ToString = m_Address.ToString();
            } catch ( Exception ex ) {
                TraceException( ex );
                m_Address = IPAddress.None;
                m_ToString = "(error)";
            }

            m_ConnectedOn = DateTime.Now;

            if ( m_CreatedCallback != null )
            {
                m_CreatedCallback( this );
            }
        }
Example #40
0
 public void Displose()
 {
     buffer = null;
     tmpbuf = null;
     m_Crypto.Dispose();
     m_SendControlCode = null;
     m_RecvControlCode = null;
     _queue = null;
     m_UserInfo = null;
 }
Example #41
0
		public virtual void Dispose(bool flush) {
			if (mSocket == null || mDisposing) {
				return;
			}

			mDisposing = true;

			//##PACKET## Logout
			Thread.Sleep(100);

			if (flush) {
				Flush();
			}

			try {
				mSocket.Shutdown(SocketShutdown.Both);
			} catch (SocketException ex) {
				Debug.WriteLine(ex);
			}

			try {
				mSocket.Close();
				SocketPool.ReleaseSocket(mSocket);
			} catch (SocketException ex) {
				Debug.WriteLine(ex);
			}

			mSocket = null;

			mBuffer = null;
			mRecvBuffer = null;
			mOnReceive = null;
			mOnSend = null;
			mRunning = false;

			mDisposed.Enqueue(this);

			if (!mSendQueue.IsEmpty) {
				lock (mSendQueue)
					mSendQueue.Clear();
			}
		}
Example #42
0
		public NetState(Socket socket, SocketConnector messagePump) {
			mSocket = socket;
			mBuffer = new ByteQueue();
			mSeeded = false;
			mRunning = false;
			mRecvBuffer = new byte[mBufferSize];
			mMessagePump = messagePump;

			mSendQueue = new SendQueue();
			UpdateAcitivty();

			InstanceID = mInstanceID++;
			Instances.Add(InstanceID, this);

			try {
				mAddress = ((IPEndPoint)mSocket.RemoteEndPoint).Address;
			} catch (Exception ex) {
				ExceptionHandler.Trace(ex);
				mAddress = IPAddress.None;
			}

			mConnectedOn = DateTime.Now;

			if (mCreatedCallback != null)
				mCreatedCallback(this);
		}
Example #43
0
        internal void Send_Start()
        {
            if (!Running || !_socket.Connected)
            {
                DisposeSendSystem();
                return;
            }

            Packet packet = null;
            try
            {
                ByteQueue byteQueue = new ByteQueue();
                int length = 0;
                    while (!PacketsToBeSent.IsEmpty && length <= 1024)
                    {
                        if (!PacketsToBeSent.TryDequeue(out packet))
                        {
                            Interlocked.Exchange(ref _TimesEnqueuedForSend, 0);
                            return;
                        }

                        if (!packet.Shared)
                            packet.Write();

                        byte[] packetBuffer = packet.GetBuffer();
                        length += packetBuffer.Length;

                        byteQueue.Enqueue(packetBuffer, 0, packetBuffer.Length);
                        packet.Release();

                    }

                if (byteQueue.Length > 0)
                {
                    byte[] data = new byte[length];
                    byteQueue.Dequeue(data, 0, data.Length);
                    Send_Async(data);
                }
                else
                {
                    Interlocked.Exchange(ref _TimesEnqueuedForSend, 0);

                    if (!PacketsToBeSent.IsEmpty)
                    {
                        int newValue = Interlocked.Increment(ref _TimesEnqueuedForSend);

                        if (newValue == 1)
                        {
                            Server.SendClientQueue.Enqueue(this);
                            Server.NetworkSignal.Set();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                MarkToDispose();
                DisposeSendSystem();
                if(packet != null)
                    Logger.Log(Logger.LogLevel.Error, "Sending packet: {0}", packet.ToString());
                Logger.Log(Logger.LogLevel.Error, e.ToString());

                // TODO: log something?
            }
        }
Example #44
0
		private bool HandleSeed(NetState ns, ByteQueue buffer) {
			if (buffer.GetPacketID() == 0xEF) {
				// new packet in client	6.0.5.0	replaces the traditional seed method with a	seed packet
				// 0xEF	= 239 =	multicast IP, so this should never appear in a normal seed.	 So	this is	backwards compatible with older	clients.
				ns.Seeded = true;
				return true;
			} else if (buffer.Length >= 4) {
				byte[] m_Peek = new byte[4];

				buffer.Dequeue(m_Peek, 0, 4);

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

				if (seed == 0) {
					Console.WriteLine("Login: {0}: Invalid client detected, disconnecting", ns);
					ns.Dispose();
					return false;
				}

				ns.m_Seed = seed;
				ns.Seeded = true;
				return true;
			} else {
				return false;
			}
		}