예제 #1
0
    public static string GeneratePlayerCommandsMessage(CmdState cmd)
    {
        NetworkingMessage msg = new NetworkingMessage(NetworkingMessageType.CMDS);

        msg.content = ToJson(cmd);
        return(ToJson(msg));
    }
예제 #2
0
    IEnumerator HandleClient()
    {
        while (true)
        {
            client.DispatchCallback(status);

            int netMessagesCount = client.ReceiveMessagesOnConnection(connection, netMessages, maxMessages);

            if (netMessagesCount > 0)
            {
                for (int i = 0; i < netMessagesCount; i++)
                {
                    // ref NetworkingMessage netMessage = ref netMessages[i];
                    NetworkingMessage netMessage = netMessages[i];

                    Debug.Log("Message received from server - Channel ID: " + netMessage.channel + ", Data length: " + netMessage.length);

                    netMessage.Destroy();
                }
            }

            Thread.Sleep(15);
            yield return(null);
        }
    }
예제 #3
0
    IEnumerator HandleServer()
    {
        while (true)
        {
            server.DispatchCallback(status);

            int netMessagesCount = server.ReceiveMessagesOnListenSocket(listenSocket, netMessages, maxMessages);

            if (netMessagesCount > 0)
            {
                for (int i = 0; i < netMessagesCount; i++)
                {
                    // ref NetworkingMessage netMessage = ref netMessages[i];
                    NetworkingMessage netMessage = netMessages[i];

                    Debug.Log("Message received from - ID: " + netMessage.connection + ", Channel ID: " + netMessage.channel + ", Data length: " + netMessage.length);

                    netMessage.Destroy();
                }
            }

            Thread.Sleep(15);
            yield return(null);
        }
    }
예제 #4
0
    public static string GenerateGameStateMessage(GameState gs)
    {
        NetworkingMessage msg = new NetworkingMessage(NetworkingMessageType.GAME_STATE);

        msg.content = ToJson(gs);
        return(ToJson(msg));
    }
예제 #5
0
    public static byte[] GenerateUnitCommandNetworkingMessage(UnitCommand uc)
    {
        NetworkingMessage nm = new NetworkingMessage();

        nm.type    = NetworkingMessageType.USER_COMMANDS;
        nm.content = ToByteArray(uc);

        return(ToByteArray(nm));
    }
예제 #6
0
    public static byte[] GenerateClientIDNetworkingMessage(uint id)
    {
        NetworkingMessage nm = new NetworkingMessage();

        nm.type    = NetworkingMessageType.SERVER_SEND_ID;
        nm.content = ToByteArray(id);

        return(ToByteArray(nm));
    }
예제 #7
0
    public static byte[] GenerateUsernameNetworkingMessage(string username)
    {
        NetworkingMessage nm = new NetworkingMessage();

        nm.type    = NetworkingMessageType.CLIENT_USERNAME;
        nm.content = ToByteArray(username);

        return(ToByteArray(nm));
    }
예제 #8
0
    public static string GenerateServerAcceptJoinMessage(GameStartInfo gsi)
    {
        NetworkingMessageType msgType = NetworkingMessageType.SERVER_JOIN_RESPONSE;

        NetworkingMessage msg = new NetworkingMessage(msgType);

        msg.content = ToJson(gsi);
        return(ToJson(msg));
    }
예제 #9
0
    public static byte[] GenerateEntityDataNetworkingMessage(List <EntityData> ed, int frame)
    {
        NetworkingMessage nm = new NetworkingMessage();

        nm.type    = NetworkingMessageType.ENTITY_DATA;
        nm.content = ToByteArray(ed);
        nm.frame   = frame;

        return(ToByteArray(nm));
    }
예제 #10
0
    public static byte[] GenerateEntityStateNetworkingMessage(List <EntityState> es, int frame)
    {
        NetworkingMessage nm = new NetworkingMessage();

        nm.type    = NetworkingMessageType.ENTITY_STATE;
        nm.content = ToByteArray(es);
        nm.frame   = frame;

        return(ToByteArray(nm));
    }
예제 #11
0
    public static byte[] GeneratePlayerStateNetworkingMessage(List <PlayerState> ps, int frame)
    {
        NetworkingMessage nm = new NetworkingMessage();

        nm.type    = NetworkingMessageType.PLAYER_STATE;
        nm.content = ToByteArray(ps);
        nm.frame   = frame;

        return(ToByteArray(nm));
    }
예제 #12
0
    public static byte[] GenerateGameStateNetworkingMessage(GameState gs, int frame)
    {
        NetworkingMessage nm = new NetworkingMessage();

        nm.type    = NetworkingMessageType.GAME_STATE;
        nm.content = ToByteArray(gs);
        nm.frame   = frame;

        return(ToByteArray(nm));
    }
예제 #13
0
    public static byte[] GeneratePlayerDataNetworkingMessage(List <PlayerData> pd, int frame)
    {
        NetworkingMessage nm = new NetworkingMessage();

        nm.type    = NetworkingMessageType.PLAYER_DATA;
        nm.content = ToByteArray(pd);
        nm.frame   = frame;

        return(ToByteArray(nm));
    }
예제 #14
0
    void HandleGameState(NetworkingMessage inmsg)
    {
        GameState ngs = NetworkingMessageTranslator.ParseGameState(inmsg.content);

        // TODO
        // Add handling for out of place turns... this should never happen tho...

        // Flag Update game runner
        state        = ClientState.BEGIN_ANIMATION;
        newGameState = ngs;
    }
            public void AddMessage(NetworkingMessage message)
            {
#if UNITY_ENABLE_COLLECTION_CHECKS
                if (m_IncomingMessages.Ptr == null)
                {
                    throw new NullReferenceException();
                }
#endif

                Debug.Log($"add - messageptr = {message.release}");
                m_IncomingMessages->Add(message);
                AddEvent(NetworkEvent.Type.Data);
            }
예제 #16
0
 public void readNetworkMessages()
 {
     if (netMessageCount > 0)
     {
         for (int i = 0; i < netMessageCount; i++)
         {
             ref NetworkingMessage netMessage = ref netMessages[i];
             netMessage.CopyTo(messageDataBuffer);
             uint connection = netMessage.connection; //who sent it
             netMessage.Destroy();
             Message m = Message.decipherMessage(messageDataBuffer);
             HandleNetworkMessage(m);
         }
     }
예제 #17
0
    void OnMessage(ref Valve.Sockets.NetworkingMessage netMessage)
    {
        // Debug.Log(String.Format("Message received server - ID: {0}, Channel ID: {1}, Data length: {2}", netMessage.connection, netMessage.channel, netMessage.length));

        byte[] messageDataBuffer = new byte[netMessage.length];

        netMessage.CopyTo(messageDataBuffer);
        netMessage.Destroy();

        try
        {
            NetworkingMessage msg = NetworkingMessageTranslator.ParseMessage(messageDataBuffer);

            UInt32 clientID = netMessage.connection;

            switch (msg.type)
            {
            case NetworkingMessageType.GAME_STATE:

                GameState gs = (GameState)NetworkingMessageTranslator.ByteArrayToObject(msg.content);

                Debug.Log("Server recieved game state: " + gs.state);

                break;

            case NetworkingMessageType.CLIENT_USERNAME:

                string username = (string)NetworkingMessageTranslator.ByteArrayToObject(msg.content);

                sgr.pm.UpdateUsername(clientID, username);

                break;

            case NetworkingMessageType.USER_COMMANDS:
                UnitCommand uc = (UnitCommand)NetworkingMessageTranslator.ByteArrayToObject(msg.content);

                Debug.Log("Server recieved unit command: " + uc.entityID);

                sgr.ReceiveUnitCommand(uc);

                break;
            }
        }
        catch (Exception ex)
        {
            Debug.LogWarning(ex.ToString());
        }
    }
            public bool PopMessage(out NetworkingMessage message)
            {
                if (m_IncomingMessages->Length > 0)
                {
                    message = UnsafeUtility.ReadArrayElement <NetworkingMessage>(m_IncomingMessages->Ptr, 0);
                    if (m_IncomingMessages->Length > 1)
                    {
                        m_IncomingMessages->RemoveAtSwapBack <NetworkingMessage>(0);
                    }
                    Debug.Log($"pop - messageptr = {message.release}");

                    return(true);
                }

                message = default;
                return(false);
            }
예제 #19
0
    void HandleAcceptJoin(NetworkingMessage inmsg)
    {
        GameStartInfo gsi      = NetworkingMessageTranslator.ParseServerAcceptJoin(inmsg.content);
        int           playerID = gsi.playerID;

        if (playerID > -1)
        {
            this.state = ClientState.JOIN_ACCEPTED;
            Debug.Log("Client Joined Server. PlayerID is " + playerID + " ... Waiting for game to start");
            playerController.playerID = playerID;
            gr.UpdateTerrainSeed(gsi.terrainSeed);
        }
        else
        {
            Debug.Log("Client was not allowed to connect... Disconnecting");
            SendDisconnect();
            playerController.OnFailedToConnect();
        }
    }
예제 #20
0
    void HandleIncomingData(ConnectionObject co, String data)
    {
        NetworkingMessage inmsg = NetworkingMessageTranslator.ParseMessage(data);

        if (inmsg.type == NetworkingMessageType.CLIENT_JOIN)
        {
            HandleJoin(co, inmsg);
        }

        if (inmsg.type == NetworkingMessageType.DISCONNECT)
        {
            HandleDisconnect(co, inmsg);
        }

        if (inmsg.type == NetworkingMessageType.CMDS)
        {
            HandlePlayerCommands(co, inmsg);
        }
    }
예제 #21
0
    void HandleIncomingData(String data)
    {
        NetworkingMessage inmsg = NetworkingMessageTranslator.ParseMessage(data);

        Debug.Log("Client received : " + data);

        if (inmsg.type == NetworkingMessageType.SERVER_JOIN_RESPONSE)
        {
            HandleAcceptJoin(inmsg);
        }

        if (inmsg.type == NetworkingMessageType.DISCONNECT)
        {
            HandleDisconnect(inmsg);
        }

        if (inmsg.type == NetworkingMessageType.GAME_STATE)
        {
            HandleGameState(inmsg);
        }
    }
예제 #22
0
    void HandleJoin(ConnectionObject co, NetworkingMessage inmsg)
    {
        bool canJoin = PlayersCanJoin();

        if (canJoin)
        {
            co.serverPlayerID = playerIDTracker++;
        }

        String outmsg = NetworkingMessageTranslator.GenerateServerAcceptJoinMessage(new GameStartInfo(co.serverPlayerID, gr.terrainSeed));

        ch.BeginSend(co, outmsg);

        // Apply game logic...

        // If enough players begin game
        if (CanStartGame())
        {
            state = ServerState.SETUP_GAME;
        }
    }
예제 #23
0
    void Update()
    {
        if (client == null)
        {
            return;
        }

        client.DispatchCallback(status);
        int netMessagesCount = client.ReceiveMessagesOnConnection(connection, netMessages, maxMessages);

        if (netMessagesCount > 0)
        {
            for (int i = 0; i < netMessagesCount; i++)
            {
                ref NetworkingMessage netMessage = ref netMessages[i];

                Debug.Log("Message received from server - Channel ID: " + netMessage.channel + ", Data length: " + netMessage.length);

                netMessage.Destroy();
            }
        }
예제 #24
0
    void HandlePlayerCommands(ConnectionObject co, NetworkingMessage inmsg)
    {
        CmdState cmd = NetworkingMessageTranslator.ParseShipCommands(inmsg.content);

        if (state == ServerState.COMMAND)
        {
            bool valid = gr.AddPlayersCommands(cmd, co.serverPlayerID);

            if (!valid)
            {
                //TODO
                // Send msg back to client saying cmd are invalid
            }

            // CHECK IF ALL PLAYER CMDS ARE IN
            // IF SO BEGIN PROCESSING
            if (ReadyToProcess())
            {
                state = ServerState.PROCESSING;
                Debug.Log("Beginning to process gamestate");
            }
        }
    }
    void Update()
    {
        if (networkClient != null)
        {
            networkClient.DispatchCallback(status);

            int netMessagesCount = isServer ? networkClient.ReceiveMessagesOnListenSocket(listenSocket, netMessages, maxMessages) : networkClient.ReceiveMessagesOnConnection(connection, netMessages, maxMessages);
            if (netMessagesCount > 0)
            {
                for (int i = 0; i < netMessagesCount; i++)
                {
                    ref NetworkingMessage netMessage = ref netMessages[i];

                    Debug.Log("Message received from server - Channel ID: " + netMessage.channel + ", Data length: " + netMessage.length);

                    netMessage.CopyTo(messageDataBuffer);
                    netMessage.Destroy();

                    string result = Encoding.ASCII.GetString(messageDataBuffer);
                    messages.Add(result);
                }
            }
        }
예제 #26
0
 void HandleDisconnect(NetworkingMessage inmsg)
 {
     this.state = ClientState.DISCONNECTING;
     EnableSafeToDisconnect();
 }
예제 #27
0
    void HandleDisconnect(ConnectionObject co, NetworkingMessage inmsg)
    {
        ch.CloseConnection(co);

        // Modify Game Logic??
    }
예제 #28
0
        public static void ServerLoop()
        {
            Library.Initialize();

            server = new NetworkingSockets();
            Address address = new Address();

            NetworkingUtils utils = new NetworkingUtils();

            utils.SetDebugCallback(DebugType.Important, (type, message) => {
                Console.WriteLine("Valve Debug - Type: {0}, Message: {1}", type, message);
            });

            unsafe {
                int sendRateMin    = 5 * 1024 * 1024;
                int sendRateMax    = MAX_UPLOAD;
                int sendBufferSize = MAX_BUFFER;
                utils.SetConfigurationValue(ConfigurationValue.SendRateMin, ConfigurationScope.Global, IntPtr.Zero, ConfigurationDataType.Int32, new IntPtr(&sendRateMin));
                utils.SetConfigurationValue(ConfigurationValue.SendRateMax, ConfigurationScope.Global, IntPtr.Zero, ConfigurationDataType.Int32, new IntPtr(&sendRateMax));
                utils.SetConfigurationValue(ConfigurationValue.SendBufferSize, ConfigurationScope.Global, IntPtr.Zero, ConfigurationDataType.Int32, new IntPtr(&sendBufferSize));
            }

            address.SetAddress("::0", port);

            uint listenSocket = server.CreateListenSocket(ref address);
            uint pollGroup    = server.CreatePollGroup();

            Console.WriteLine($"Server {SERVER_NAME} started Listening on port {port} for maximum of {MAX_PLAYERS} players\nEnforcing maps is {ENFORCE_MAPS}");

            StartAnnouncing();

            StatusCallback status = (ref StatusInfo info, IntPtr context) => {
                switch (info.connectionInfo.state)
                {
                case ConnectionState.None:
                    break;

                case ConnectionState.Connecting:
                    server.AcceptConnection(info.connection);
                    server.SetConnectionPollGroup(pollGroup, info.connection);
                    break;

                case ConnectionState.Connected:
                    Console.WriteLine("Client connected - IP: " + info.connectionInfo.address.GetIP());

                    bool openSlot = false;

                    for (byte i = 0; i < MAX_PLAYERS; i++)
                    {
                        if (players[i] == null)
                        {
                            players[i] = new Player(i, info.connection, info.connectionInfo.address);

                            byte[] versionNumber  = ASCIIEncoding.ASCII.GetBytes(VERSION_NUMBER);
                            byte[] versionMessage = new byte[versionNumber.Length + 1];

                            versionMessage[0] = (byte)OpCode.VersionNumber;
                            Array.Copy(versionNumber, 0, versionMessage, 1, versionNumber.Length);
                            server.SendMessageToConnection(players[i].connection, versionMessage, SendFlags.Reliable | SendFlags.NoNagle);

                            if (ENFORCE_MAPS)
                            {
                                server.SendMessageToConnection(players[i].connection, mapListBytes, SendFlags.Reliable);
                                server.SendMessageToConnection(players[i].connection, GetCurrentMapHashMessage(), SendFlags.Reliable);
                            }

                            foreach (Player player in players)
                            {
                                if (player != null && player != players[i])
                                {
                                    server.SendMessageToConnection(players[i].connection, new byte[] { (byte)OpCode.Connect, player.playerID }, SendFlags.Reliable);
                                    server.SendMessageToConnection(player.connection, new byte[] { (byte)OpCode.Connect, i }, SendFlags.Reliable);

                                    if (player.usernameMessage != null)
                                    {
                                        server.SendMessageToConnection(players[i].connection, player.usernameMessage, SendFlags.Reliable);
                                    }
                                    if (player.allGearUploaded)
                                    {
                                        foreach (KeyValuePair <string, byte[]> value in player.gear)
                                        {
                                            server.SendMessageToConnection(players[i].connection, value.Value, SendFlags.Reliable);
                                        }
                                    }
                                }
                            }

                            server.FlushMessagesOnConnection(players[i].connection);

                            openSlot = true;
                            break;
                        }
                    }

                    if (!openSlot)
                    {
                        server.CloseConnection(info.connection);
                    }
                    break;

                case ConnectionState.ClosedByPeer:
                    RemovePlayer(info.connection);
                    break;
                }
            };

#if VALVESOCKETS_SPAN
            MessageCallback messageCallback = (in NetworkingMessage netMessage) => {
                byte[] messageData = new byte[netMessage.length];
                netMessage.CopyTo(messageData);

                Player sendingPlayer = null;
                foreach (Player player in players)
                {
                    if (player != null && player.connection == netMessage.connection)
                    {
                        sendingPlayer = player;
                        break;
                    }
                }

                if (sendingPlayer != null)
                {
                    ProcessMessage(messageData, sendingPlayer.playerID, server);
                }
            };
#else
            const int maxMessages = 256;

            NetworkingMessage[] netMessages = new NetworkingMessage[maxMessages];
#endif
            while (RUNNING)
            {
                server.DispatchCallback(status);

#if VALVESOCKETS_SPAN
                server.ReceiveMessagesOnPollGroup(pollGroup, messageCallback, 256);
#else
                int netMessagesCount = server.ReceiveMessagesOnConnection(listenSocket, netMessages, maxMessages);

                if (netMessagesCount > 0)
                {
                    for (int i = 0; i < netMessagesCount; i++)
                    {
                        ref NetworkingMessage netMessage = ref netMessages[i];

                        byte[] messageData = new byte[netMessage.length];
                        netMessage.CopyTo(messageData);

                        Player sendingPlayer = null;
                        foreach (Player player in players)
                        {
                            if (player != null && player.connection == netMessage.connection)
                            {
                                sendingPlayer = player;
                                break;
                            }
                        }

                        //Console.WriteLine("Recieved packet from connection {0}, sending player null: {1}", netMessage.connection, sendingPlayer == null);

                        if (sendingPlayer != null)
                        {
                            ProcessMessage(messageData, sendingPlayer.playerID, server);
                        }

                        netMessage.Destroy();
                    }
                }
#endif

                mapVotes.Clear();
                total_players = 0;
                foreach (Player player in players)
                {
                    if (player != null)
                    {
                        total_players++;

                        if (player.timeoutWatch.ElapsedMilliseconds > 15000)
                        {
                            Console.WriteLine($"{player.playerID} has been timed out for not responding for 15 seconds");

                            RemovePlayer(player.connection, player.playerID, true);
                        }

                        if (!mapVotes.ContainsKey(player.currentVote))
                        {
                            mapVotes.Add(player.currentVote, 1);
                        }
                        else
                        {
                            mapVotes[player.currentVote]++;
                        }
                    }
                }

                // Handle map voting and map enforcement
                if (ENFORCE_MAPS)
                {
                    if (total_players == 0)
                    {
                        currentMapHash = "1";
                    }

                    bool startNewTimer = false;
                    if (mapVotes.ContainsKey("current"))
                    {
                        if (mapVotes["current"] < (int)Math.Ceiling((float)total_players / 2))
                        {
                            if (!mapVoteTimer.IsRunning)
                            {
                                startNewTimer = true;
                            }
                        }
                    }
                    else if (!mapVoteTimer.IsRunning && total_players > 0)
                    {
                        startNewTimer = true;
                    }

                    if (startNewTimer)
                    {
                        mapVoteTimer.Restart();

                        byte[] mapVoteMsg = new byte[] { (byte)OpCode.MapVote, 0, 0 };

                        foreach (Player player in players)
                        {
                            if (player != null)
                            {
                                server.SendMessageToConnection(player.connection, mapVoteMsg, SendFlags.Reliable);
                            }
                        }
                    }

                    if (mapVoteTimer.IsRunning && mapVoteTimer.ElapsedMilliseconds > 30000 && total_players > 0)
                    {
                        mapVoteTimer.Stop();

                        Tuple <string, int> mostVoted = null;

                        foreach (var item in mapVotes)
                        {
                            if (!item.Key.Equals("current"))
                            {
                                if (mostVoted == null || mostVoted.Item2 < item.Value)
                                {
                                    mostVoted = Tuple.Create <string, int>(item.Key, item.Value);
                                }
                            }
                        }

                        currentMapHash = mostVoted.Item1;

                        byte[] newMapMessage = GetCurrentMapHashMessage();

                        foreach (Player player in players)
                        {
                            if (player != null)
                            {
                                server.SendMessageToConnection(player.connection, newMapMessage, SendFlags.Reliable);

                                player.currentVote = "current";
                            }
                        }
                    }
                    else if (total_players == 0)
                    {
                        mapVoteTimer.Stop();
                    }
                }
            }
예제 #29
0
    void OnMessage(ref Valve.Sockets.NetworkingMessage netMessage)
    {
        // Debug.Log(String.Format("Message received client - ID: {0}, Channel ID: {1}, Data length: {2}", netMessage.connection, netMessage.channel, netMessage.length));

        byte[] messageDataBuffer = new byte[netMessage.length];

        netMessage.CopyTo(messageDataBuffer);
        netMessage.Destroy();

        try
        {
            NetworkingMessage msg = NetworkingMessageTranslator.ParseMessage(messageDataBuffer);

            switch (msg.type)
            {
            case NetworkingMessageType.GAME_STATE:

                GameState gs = (GameState)NetworkingMessageTranslator.ByteArrayToObject(msg.content);

                Instance.cgr.ReceiveGameState(gs, msg.frame);

                break;

            case NetworkingMessageType.SERVER_SEND_ID:

                Instance.cgr.playerID = (uint)NetworkingMessageTranslator.ByteArrayToObject(msg.content);

                Debug.Log("Client received client ID: " + Instance.cgr.playerID);

                break;

            case NetworkingMessageType.ENTITY_DATA:

                List <EntityData> ed = (List <EntityData>)NetworkingMessageTranslator.ByteArrayToObject(msg.content);

                Instance.cgr.ReceiveEntityData(ed, msg.frame);

                break;

            case NetworkingMessageType.ENTITY_STATE:

                List <EntityState> es = (List <EntityState>)NetworkingMessageTranslator.ByteArrayToObject(msg.content);

                Instance.cgr.ReceiveEntityState(es, msg.frame);

                break;

            case NetworkingMessageType.PLAYER_DATA:

                List <PlayerData> pd = (List <PlayerData>)NetworkingMessageTranslator.ByteArrayToObject(msg.content);

                Instance.cgr.ReceivePlayerData(pd, msg.frame);

                break;

            case NetworkingMessageType.PLAYER_STATE:

                List <PlayerState> ps = (List <PlayerState>)NetworkingMessageTranslator.ByteArrayToObject(msg.content);

                Instance.cgr.ReceivePlayerState(ps, msg.frame);

                break;
            }
        }
        catch (Exception ex)
        {
            Debug.LogWarning(ex.ToString());
        }
    }
        static void Run(CancellationTokenSource cts)
        {
            ushort            port    = 8080;
            NetworkingSockets server  = new NetworkingSockets();
            Address           address = new Address();

            address.SetAddress("::0", port);

            uint listenSocket = server.CreateListenSocket(ref address);

            StatusCallback status = (info, context) => {
                switch (info.connectionInfo.state)
                {
                case ConnectionState.None:
                    break;

                case ConnectionState.Connecting:
                    server.AcceptConnection(info.connection);
                    break;

                case ConnectionState.Connected:
                    Console.WriteLine("Client connected - ID: " + info.connection + ", IP: " + info.connectionInfo.address.GetIP());
                    break;

                case ConnectionState.ClosedByPeer:
                    server.CloseConnection(info.connection);
                    Console.WriteLine("Client disconnected - ID: " + info.connection + ", IP: " + info.connectionInfo.address.GetIP());
                    break;
                }
            };

#if VALVESOCKETS_SPAN
            MessageCallback message = (in NetworkingMessage netMessage) => {
                Console.WriteLine("Message received from - ID: " + netMessage.connection + ", Channel ID: " + netMessage.channel + ", Data length: " + netMessage.length);
            };
#else
            const int maxMessages = 20;

            NetworkingMessage[] netMessages = new NetworkingMessage[maxMessages];
#endif

            while (!cts.IsCancellationRequested)
            {
                server.DispatchCallback(status);

#if VALVESOCKETS_SPAN
                server.ReceiveMessagesOnListenSocket(listenSocket, message, 20);
#else
                int netMessagesCount = server.ReceiveMessagesOnListenSocket(listenSocket, netMessages, maxMessages);

                if (netMessagesCount > 0)
                {
                    for (int i = 0; i < netMessagesCount; i++)
                    {
                        ref NetworkingMessage netMessage = ref netMessages[i];

                        Console.WriteLine("Message received from - ID: " + netMessage.connection + ", Channel ID: " + netMessage.channel + ", Data length: " + netMessage.length);

                        netMessage.Destroy();
                    }
                }
#endif

                Thread.Sleep(15);
            }