Esempio n. 1
0
 public void TCP_EnqueueMessage(NET_Messages.IMessage message)
 {
     lock (tcpOUT_MessageQueue)
     {
         tcpOUT_MessageQueue.Enqueue(message);
     }
 }
Esempio n. 2
0
 public void UDP_EnqueueMessage(NET_Messages.IMessage message)
 {
     lock (udpOUT_MessageQueue)
     {
         udpOUT_MessageQueue.Enqueue(message);
     }
 }
Esempio n. 3
0
 private void UDP_MainThread()
 {
     while (status != UDP_Status.UDP_Shutdown)
     {
         while (status == UDP_Status.UDP_Running)
         {
             //Host is only broadcasting
             if (isHost == true)
             {
                 if (udpOUT_MessageQueue.Count > 0)
                 {
                     lock (udpOUT_MessageQueue)
                     {
                         while (udpOUT_MessageQueue.Count > 0)
                         {
                             NET_Messages.IMessage message = udpOUT_MessageQueue.Dequeue();
                             UDP_Broadcast(UDP_Serialize(message));
                         }
                     }
                 }
             }
             //Client is only listening
             else
             {
                 UDP_Listen();
             }
             Thread.Sleep(60);
         }
         Thread.Sleep(250);
     }
     udpClient.Client.Close();
     udpClient.Close();
     //Game is closing! --> Exit thread
 }
Esempio n. 4
0
        private byte[] UDP_Serialize(NET_Messages.IMessage message)
        {
            BinaryFormatter binForm = new BinaryFormatter();

            using (MemoryStream ms = new MemoryStream())
            {
                binForm.Serialize(ms, message);
                return(ms.ToArray());
            }
        }
Esempio n. 5
0
 public void TCP_EnqueueMessage(NET_Messages.IMessage message, int playerID)
 {
     if (playerID != 1 && message != null)
     {
         if (connections[playerID - 2] != null)
         {
             this.connections[playerID - 2].TCP_EnqueueMessage(message);
         }
     }
 }
Esempio n. 6
0
        private void TCP_Receive()
        {
            if (stream.DataAvailable == true)
            {
                try
                {
                    byte[] messageData = null;
                    using (MemoryStream ms = new MemoryStream())
                    {
                        //Read byte size of message
                        byte[] header  = new byte[8];
                        byte[] message = new byte[1];

                        this.stream.Read(header, 0, 8);
                        if (header[0] == 65 && header[1] == 81 && header[2] == 69 && header[3] == 88)
                        {
                            int totalSize = BitConverter.ToInt32(header, 4);
                            int size      = totalSize;

                            //Read main message
                            while (size > 0)
                            {
                                byte[] buffer   = new byte[size];
                                int    received = this.stream.Read(buffer, 0, size);
                                ms.Write(buffer, 0, received);
                                size -= received;
                            }
                            messageData = ms.ToArray();
                        }
                        else
                        {
                            NET_Debug.InjectMessage("[NET_TCP_CN]", "[ERROR] Wrong header");
                        }
                    }
                    //Deserialize message
                    if (messageData != null)
                    {
                        NET_Messages.IMessage deserialized = TCP_Deserialize(messageData);
                        if (deserialized != null)
                        {
                            lock (tcpIN_MessageQueue)
                            {
                                tcpIN_MessageQueue.Enqueue(deserialized);
                            }
                        }
                    }
                }
                catch
                {
                    NET_Debug.InjectMessage("[NET_TCP_CN]", "[ERROR] Receiving");
                    //Nothing to do here...
                }
            }
            Thread.Sleep(1);
        }
Esempio n. 7
0
 private byte[] TCP_Serialize(NET_Messages.IMessage message)
 {
     try
     {
         BinaryFormatter binForm = new BinaryFormatter();
         using (MemoryStream ms = new MemoryStream())
         {
             binForm.Serialize(ms, message);
             return(ms.ToArray());
         }
     }
     catch
     {
         NET_Debug.InjectMessage("[NET_TCP_CN]", "[FATAL ERROR] Serializing failed");
         return(null);
     }
 }
Esempio n. 8
0
        private void UDP_Listen()
        {
            if (udpClient.Available >= 12)
            {
                byte[] buffer  = udpClient.Receive(ref endPoint);
                byte[] header  = new byte[12];
                byte[] message = new byte[1];         //Placeholder

                Array.Copy(buffer, 0, header, 0, 12); //Copy bytes from buffer[] to header[]

                //Check if message is valid
                if (header[0] == 0 && header[1] == 0 && header[2] == 0 && header[3] == 0)
                {
                    if (header[4] == 65 && header[5] == 81 && header[6] == 69 && header[7] == 88)
                    {
                        int mainMessageLength = BitConverter.ToInt32(header, 8);
                        message = new byte[mainMessageLength];
                        int rest = mainMessageLength;
                        if (buffer.Length - 12 > 0)
                        {
                            //Looks like this never happens. Seems like (receive) handles amount of received bytes automatically.
                            //Copy rest of message bytes from buffer[] to message[]
                            if (buffer.Length - 12 <= rest)
                            {
                                Array.Copy(buffer, 0, message, 12, buffer.Length - 12);
                                rest -= buffer.Length - 12;
                            }
                            else
                            {
                                Array.Copy(buffer, 0, message, 12, rest);
                                rest = 0;
                            }
                        }
                        while (rest > 0)
                        {//Receive rest of message data
                            if (udpClient.Available > 0)
                            {
                                buffer = null;
                                buffer = udpClient.Receive(ref endPoint);
                                if (buffer.Length <= rest)
                                {
                                    Array.Copy(buffer, 0, message, mainMessageLength - rest, buffer.Length);
                                    rest -= buffer.Length;
                                }
                                else
                                {
                                    //Looks like this never happens. (See above)
                                    Array.Copy(buffer, 0, message, mainMessageLength - rest, rest);
                                    rest = 0;
                                }
                            }
                        }
                        //Deserialize binary data
                        NET_Messages.IMessage deserialized = UDP_Deserialize(message);

                        //Enqueue message to global queue
                        if (deserialized != null)
                        {
                            lock (udpIN_MessageQueue)
                            {
                                udpIN_MessageQueue.Enqueue(deserialized);
                            }
                        }
                    }
                }
            }
        }
Esempio n. 9
0
        private void NET_ProcessMessage(NET_Messages.IMessage message)
        {
            //---------------------------------------------------------------------------------------------//
            //Message handling:
            //---------------------------------------------------------------------------------------------//
            if (message != null)
            {
                //Host message handling
                if (isHost == true)
                {
                    //Update message
                    if (message as NET_Messages.NET_Message_Update != null)
                    {
                        object objectBuffer = 0;
                        byte[] byteBuffer   = new byte[1];
                        message.GetData(ref byteBuffer, ref objectBuffer, false);
                        NET_DataPack pack = new NET_DataPack(byteBuffer);

                        //Set update data to internal slots
                        int messagePID = (int)pack.GetData("PlayerID");
                        playersGameData[messagePID - 1] = pack;
                    }
                    //Event call message
                    else if (message as NET_Messages.NET_Message_EventCall != null)
                    {
                        object objectBuffer = 0;
                        byte[] byteBuffer   = new byte[1];
                        message.GetData(ref byteBuffer, ref objectBuffer, false);
                        NET_DataPack pack = new NET_DataPack(byteBuffer);

                        //Add event to list
                        NET_EventCall call = new NET_EventCall(pack);
                        eventCalls.Add(call);
                    }
                    //Disconnect message
                    else if (message as NET_Messages.NET_Message_Disconnect != null)
                    {
                        object objectBuffer = 0;
                        byte[] byteBuffer   = new byte[1];
                        message.GetData(ref byteBuffer, ref objectBuffer, false);
                        NET_DataPack pack = new NET_DataPack(byteBuffer);

                        int messagePID = (int)pack.GetData("PlayerID");
                        tcpServer.TCP_Server_ClientDisconnected(messagePID);
                    }
                }
                //Client message handling
                else
                {
                    //Server broadcast
                    if (message as NET_Messages.NET_Message_ServerBroadcast != null)
                    {
                        object objectBuffer = 0;
                        byte[] byteBuffer   = new byte[1];
                        message.GetData(ref byteBuffer, ref objectBuffer, false);
                        NET_DataPack pack = new NET_DataPack(byteBuffer);

                        string     ipAddress = (string)pack.GetData("ServerIPAddress");
                        int        playerC   = (int)pack.GetData("PlayerSlotsUsed");
                        string     serName   = (string)pack.GetData("ServerName");
                        GAME_State state     = (GAME_State)pack.GetData("GameState");
                        if (serverInfos.ContainsKey(ipAddress) == false)
                        {
                            NET_ServerInfo info = new NET_ServerInfo(ipAddress, playerC, gameState, serName);
                            serverInfos.Add(ipAddress, info);
                        }
                        else
                        {
                            NET_ServerInfo info = serverInfos[ipAddress];
                            info.INFO_SetPlayerCount(playerC);
                            info.INFO_SetState(gameState);
                            serverInfos[ipAddress] = info;
                        }
                        //If server broadcast is from connected server --> set player count
                        if (ipAddress == this.serverIP.ToString())
                        {
                            this.playerCount = playerC;
                        }
                    }
                    //Update message
                    else if (message as NET_Messages.NET_Message_Update != null)
                    {
                        object objectBuffer = 0;
                        byte[] byteBuffer   = new byte[1];
                        message.GetData(ref byteBuffer, ref objectBuffer, false);
                        NET_UberPack uberPack = new NET_UberPack(byteBuffer);

                        //Unpack uber pack
                        NET_DataPack packP1 = uberPack.GetPack(1);
                        NET_DataPack packP2 = uberPack.GetPack(2);
                        NET_DataPack packP3 = uberPack.GetPack(3);
                        NET_DataPack packP4 = uberPack.GetPack(4);

                        //Set update data to internal slots
                        if (packP1 != null && playerID != 1)
                        {
                            playersGameData[0] = packP1;
                        }
                        if (packP2 != null && playerID != 2)
                        {
                            playersGameData[1] = packP2;
                        }
                        if (packP3 != null && playerID != 3)
                        {
                            playersGameData[2] = packP3;
                        }
                        if (packP4 != null && playerID != 4)
                        {
                            playersGameData[3] = packP4;
                        }
                    }
                    //Event call message
                    else if (message as NET_Messages.NET_Message_EventCall != null)
                    {
                        object objectBuffer = 0;
                        byte[] byteBuffer   = new byte[1];
                        message.GetData(ref byteBuffer, ref objectBuffer, false);
                        NET_DataPack pack = new NET_DataPack(byteBuffer);

                        NET_EventCall call = new NET_EventCall(pack);
                        eventCalls.Add(call);
                    }
                    //Welcome message --> Set playerID for clients
                    else if (message as NET_Messages.NET_Message_Welcome != null)
                    {
                        object objectBuffer = 0;
                        byte[] byteBuffer   = new byte[1];
                        message.GetData(ref byteBuffer, ref objectBuffer, false);
                        NET_DataPack pack = new NET_DataPack(byteBuffer);

                        this.playerID = (int)pack.GetData("YourPlayerID");
                    }
                    //Disconnect message
                    else if (message as NET_Messages.NET_Message_Disconnect != null)
                    {
                        object objectBuffer = 0;
                        byte[] byteBuffer   = new byte[1];
                        message.GetData(ref byteBuffer, ref objectBuffer, false);
                        NET_DataPack pack = new NET_DataPack(byteBuffer);

                        int messagePID = (int)pack.GetData("PlayerID");
                        if (messagePID == playerID)
                        {
                            tcpClient.TCP_Disconnected();
                            playerID = 0;
                        }
                    }
                }
            }
        }
Esempio n. 10
0
 public void TCP_EnqueueMessage(NET_Messages.IMessage message)
 {
     connectionToServer.TCP_EnqueueMessage(message);
 }