Esempio n. 1
0
 //---------------------------------------------------------------------------------------------//
 //Public functions:
 //---------------------------------------------------------------------------------------------//
 public void Connected()
 {
     NET_Debug.InjectMessage("[NET_TCP_CN]", "[OK] Connected");
     state            = TCP_Connection_State.TCPC_Connected;
     this.thread      = new Thread(TCP_ConnectionThread);
     this.thread.Name = "[NET_TCP] connection thread";
     this.thread.Start();
 }
Esempio n. 2
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. 3
0
        private void TCP_Sending()
        {
            NET_Messages.IMessage message;

            if (tcpOUT_MessageQueue.Count > 0)
            {
                //Copy out queue to sen queue
                lock (tcpOUT_MessageQueue)
                {
                    tcpSEN_MessageQueue = new Queue <NET_Messages.IMessage>(tcpOUT_MessageQueue);
                    tcpOUT_MessageQueue.Clear();
                }

                lock (tcpSEN_MessageQueue)
                {
                    while (tcpSEN_MessageQueue.Count > 0)
                    {
                        message = tcpSEN_MessageQueue.Dequeue();
                        byte[] messageData = TCP_Serialize(message);

                        if (messageData != null)
                        {
                            sendRetryCount = 0;
                            bool retryResult = false;

                            //Sending first try...
                            retryResult = TCP_Send(messageData);

                            //Sending failed --> Retry!
                            while (retryResult == false && sendRetryCount < 5)
                            {
                                retryResult = TCP_Send(messageData);
                                sendRetryCount++;
                                NET_Debug.InjectMessage("[NET_TCP_CN]", "[ERROR] Senging: Retrying " + sendRetryCount);
                                Thread.Sleep(1);
                            }
                            if (sendRetryCount == 5)
                            {
                                //This is bad! The message was not sendable
                                //--> Target disconnected?
                                NET_Debug.InjectMessage("[NET_TCP_CN]", "[FATAL ERROR] Senging");
                            }
                        }
                        else
                        {
                            //This is really bad! The message was not serializable...
                        }
                        Thread.Sleep(1);
                    }
                }
            }
        }
Esempio n. 4
0
 //---------------------------------------------------------------------------------------------//
 //Private functions:
 //---------------------------------------------------------------------------------------------//
 private void TCP_ConnectionThread()
 {
     NET_Debug.InjectMessage("[NET_TCP_CN]", "[OK] Thread started");
     //While connection established
     while (state == TCP_Connection_State.TCPC_Connected)
     {
         TCP_Receive();
         TCP_Sending();
     }
     client.Client.Disconnect(true);
     stream.Close();
     stream.Dispose();
     client.Close();
     NET_Debug.InjectMessage("[NET_TCP_CN]", "[OK] Thread ended");
     this.state = TCP_Connection_State.TCPC_DeleteMe;
 }
Esempio n. 5
0
 public void Disconnect(int playerID)
 {
     if (state == TCP_Connection_State.TCPC_Connected)
     {
         NET_Debug.InjectMessage("[NET_TCP_CN]", "[OK] Disconnected");
         NET_Messages.NET_Message_Disconnect disconnectMessage = new NET_Messages.NET_Message_Disconnect(DateTime.Now);
         NET_DataPack pack = new NET_DataPack();
         pack.SetData("PlayerID", playerID);
         disconnectMessage.SetData(pack.SerializeData());
         lock (tcpOUT_MessageQueue)
         {
             tcpOUT_MessageQueue.Enqueue(disconnectMessage);
         }
         TCP_Sending();
         this.state = TCP_Connection_State.TCPC_Disconnected;
     }
 }
Esempio n. 6
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. 7
0
 private NET_Messages.IMessage TCP_Deserialize(byte[] messageData)
 {
     try
     {
         BinaryFormatter binForm = new BinaryFormatter();
         using (MemoryStream memStream = new MemoryStream())
         {
             memStream.Write(messageData, 0, messageData.Length);
             memStream.Seek(0, SeekOrigin.Begin);
             object obj = (object)binForm.Deserialize(memStream);
             return(obj as NET_Messages.IMessage);
         }
     }
     catch
     {
         NET_Debug.InjectMessage("[NET_TCP_CN]", "[FATAL ERROR] Deserializing failed");
         return(null);
     }
 }
Esempio n. 8
0
/// <summary>
/// Central network control.
/// </summary>
/// <param name="isHost">Sets the NET_Main to server or client mode</param>
/// <param name="timeStep">Heartbeat of the server</param>
/// <param name="name">Servername</param>
/// <param name="log"></param>
        public NET_Main(bool isHost, float timeStep, string name, bool log)
        {
            this.name     = name;
            this.timeStep = timeStep;
            this.isHost   = isHost;
            if (isHost == true)
            {
                this.playerID = 1;
            }
            if (log == false)
            {
                NET_Debug.DeactivateLogging();
            }

            playersGameData[0] = new NET_DataPack();
            playersGameData[1] = new NET_DataPack();
            playersGameData[2] = new NET_DataPack();
            playersGameData[3] = new NET_DataPack();
        }